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

Hav*_*eat 6 c# abstract-class

所以我有一个名为的类型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)
{ 
...
}
Run Code Online (Sandbox Code Playgroud)

并且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);
}
Run Code Online (Sandbox Code Playgroud)

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

Yac*_*sad 6

构造函数声明它需要一个类型的参数DayCounter.既然DayCounter是一个抽象类,那么你需要传递一个派生自的类的实例DayCounter.

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

有人定义抽象类型的参数的原因是允许多态和松散耦合.你可以有不同的派生类DayCounter,每一个不同的行为(只要他们遵守合同DayCounter).并且FunBond可以在不知道内部工作方式的情况下与这些类的实例对话.就所FunBond涉及的情况而言,它是指一个遵守合同的对象DayCounter,但不关心它是如何在内部实施的.