2016-01-13 164 views
5

所以我有一个叫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,所以我想我误解了一些东西从根本上。

+3

您需要检查哪些类型来自'DayCounter',它们是您可以分配的实例类。或者,API可能需要从DayCounter派生并提供实现。不确定,因为没有足够的上下文。 –

+1

@YuvalItzchakov嗯,这是我的想法,但我没有碰过C#一段时间,所以我想我一定要疯了。谢谢! – HavelTheGreat

回答

6

构造函数声明它需要一个DayCounter类型的参数。由于DayCounter是一个抽象类,因此您需要传递一个派生自DayCounter的类的实例。

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

某人定义抽象类型的参数的原因是允许多态性和松散耦合。您可以有不同的派生类DayCounter,每个派生类的行为不同(只要它们遵守合同DayCounter)。并且FunBond可以在不知道内部工作方式的情况下与这些类的实例交谈。就FunBond而言,它是对一个坚持DayCounter合同的对象说话,但不在意它在内部如何实现。

+0

非常感谢,我现在也看到了目的。有些挖掘最终发现了一系列来自DayCounter的日历类,我从未见过。 – HavelTheGreat

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** 
相关问题