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

How do I pass abstract class as parameter for instance of type?

所以我有一个名为 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是一个摘要class

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 应该是什么?我不能创建它的一个实例,我不能提供任何我不认为的东西......我想我需要另一个 class 从我的抽象 class 派生来提供给FunBond,所以我想我从根本上误解了一些东西。

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

的实例

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

有人将参数定义为抽象类型的原因是允许多态和松散耦合。您可以拥有 DayCounter 的不同派生 classes,每个行为都不同(只要它们遵守 DayCountercontract)。 FunBond 可以与此类 classes 的实例对话,而无需了解它们的内部工作原理。就 FunBond 而言,它正在与一个遵守 DayCounter 契约的对象对话,但并不关心它在内部是如何实现的。

问题说:

I thought I would need another class deriving from my abstract class to provide to FunBond

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

// 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**