所以我有一个名为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,name,currency,...等作为参数传递给FunBond
,但DayCounter
应该是什么?我无法创建它的实例,我无法提供任何我想不到的东西......我想我需要另一个派生自我的抽象类的类来提供给{{ 1}},所以我认为我从根本上误解了一些东西。
答案 0 :(得分:6)
构造函数声明它需要类型为DayCounter
的参数。由于DayCounter
是一个抽象类,因此您需要传递一个派生自DayCounter
的类的实例。
这并不意味着您需要更改构造函数参数类型,只需传递派生类型的实例。
有人定义抽象类型的参数的原因是允许多态和松散耦合。您可以拥有DayCounter
的不同派生类,每个类的行为都不同(只要它们符合DayCounter
的契约)。并且FunBond
可以在不知道内部工作方式的情况下与这些类的实例对话。就FunBond
而言,它是指一个符合DayCounter
合同的对象,但不关心它是如何在内部实施的。
答案 1 :(得分:0)
问题是:
我以为我需要另一个派生自我的抽象类的类 提供给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**