所以我有一个名为的类型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,所以我想我从根本上误解了一些东西.
构造函数声明它需要一个类型的参数DayCounter.既然DayCounter是一个抽象类,那么你需要传递一个派生自的类的实例DayCounter.
这并不意味着您需要更改构造函数参数类型,只需传递派生类型的实例.
有人定义抽象类型的参数的原因是允许多态和松散耦合.你可以有不同的派生类DayCounter,每一个不同的行为(只要他们遵守合同的DayCounter).并且FunBond可以在不知道内部工作方式的情况下与这些类的实例对话.就所FunBond涉及的情况而言,它是指一个遵守合同的对象DayCounter,但不关心它是如何在内部实施的.