所以我有一个名为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契约的对象讲话,但不在乎其内部实现方式。

关于c# - 如何将抽象类作为类型实例的参数传递?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34767700/

10-13 06:05