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

时间:2016-01-13 13:15:10

标签: 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)
{ 
...
}

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}},所以我认为我从根本上误解了一些东西。

2 个答案:

答案 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**