如何将抽象类作为类型实例的参数传递

本文关键字:类型 实例 参数传递 抽象类 | 更新日期: 2023-09-27 18:30:04

所以我有一个名为FunBond的类型,它有一个像这样的默认构造函数

public FunBond(int id,
            string name,
            Currency currency,
            double notional,
            DateTime maturityDate,
            List<CashFlowWithDate> couponCashFlows,
            DayCounter dayCounter)
            : base(id, name, notional, InstrumentType.FixedRateBond,  currency, maturityDate, dayCounter)
{ 
...
}

DayCounter是一个抽象类

public abstract class DayCounter
{
    public abstract string Name();
    public abstract double YearFraction(DateTime d1, DateTime d2);
    public abstract int DayCount(DateTime d1, DateTime d2);
}

现在我的问题是,我应该提供什么作为DayCounter来生成FunBond的实例?我可以指定id、名称、货币。。。等等作为参数传递给FunBond,但DayCounter应该是什么?我无法创建它的实例,也无法为它提供任何我不认为的东西。。。我想我需要从我的抽象类派生出另一个类来提供给FunBond,所以我认为我从根本上误解了一些东西。

如何将抽象类作为类型实例的参数传递

构造函数声明它需要DayCounter类型的参数。由于DayCounter是一个抽象类,因此需要传递从DayCounter派生的类的实例。

这并不意味着您需要更改构造函数参数类型,只需传递派生类型的实例即可。

有人定义抽象类型的参数是为了允许多态性和松耦合。可以有不同的DayCounter派生类,每个派生类的行为都不同(只要它们遵守DayCounter契约)。FunBond可以在不知道这些类的内部工作方式的情况下与它们的实例进行对话。就FunBond而言,它是在与一个遵守DayCounter契约的对象说话,但不关心它在内部是如何实现的。

问题是:

我想我需要从我的抽象类派生出另一个类提供给FunBond

这是正确的-您需要从抽象创建一个具体的类。

// Your derived class
public class WeekdayCounter : DayCounter
{
    public override string Name() { return "Weekday" }
    public override double YearFraction(DateTime d1, DateTime d2) { return 0.0; }
    public override int DayCount(DateTime d1, DateTime d2) { return 0; }
}
// Create a FunBond
WeekdayCounter c = new WeekdayCounter();  // **derived class**
FunBond yay = new FunBond(id,
                          name,
                          currency,
                          notional,
                          maturityDate,
                          couponCashFlows,
                          c);   // **WeekdayCounter, which is a DayCounter**