如何将抽象 class 作为类型实例的参数传递?
How do I pass abstract class as parameter for instance of type?
所以我有一个名为 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
是一个摘要class
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
应该是什么?我不能创建它的一个实例,我不能提供任何我不认为的东西......我想我需要另一个 class 从我的抽象 class 派生来提供给FunBond
,所以我想我从根本上误解了一些东西。
构造函数声明它需要一个 DayCounter
类型的参数。由于 DayCounter
是一个抽象 class ,因此您需要传递一个 class 派生自 DayCounter
.
的实例
这并不意味着您需要更改构造函数参数类型,只需传递一个派生类型的实例即可。
有人将参数定义为抽象类型的原因是允许多态和松散耦合。您可以拥有 DayCounter
的不同派生 classes,每个行为都不同(只要它们遵守 DayCounter
的 contract)。 FunBond
可以与此类 classes 的实例对话,而无需了解它们的内部工作原理。就 FunBond
而言,它正在与一个遵守 DayCounter
契约的对象对话,但并不关心它在内部是如何实现的。
问题说:
I thought I would need another class deriving from my abstract class
to provide to FunBond
这是正确的 - 您需要从抽象中创建一个具体的 class。
// 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**
所以我有一个名为 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
是一个摘要class
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
应该是什么?我不能创建它的一个实例,我不能提供任何我不认为的东西......我想我需要另一个 class 从我的抽象 class 派生来提供给FunBond
,所以我想我从根本上误解了一些东西。
构造函数声明它需要一个 DayCounter
类型的参数。由于 DayCounter
是一个抽象 class ,因此您需要传递一个 class 派生自 DayCounter
.
这并不意味着您需要更改构造函数参数类型,只需传递一个派生类型的实例即可。
有人将参数定义为抽象类型的原因是允许多态和松散耦合。您可以拥有 DayCounter
的不同派生 classes,每个行为都不同(只要它们遵守 DayCounter
的 contract)。 FunBond
可以与此类 classes 的实例对话,而无需了解它们的内部工作原理。就 FunBond
而言,它正在与一个遵守 DayCounter
契约的对象对话,但并不关心它在内部是如何实现的。
问题说:
I thought I would need another class deriving from my abstract class to provide to FunBond
这是正确的 - 您需要从抽象中创建一个具体的 class。
// 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**