【发布时间】:2016-08-31 15:52:10
【问题描述】:
我正在尝试实现以下目标,但不确定是否完全有可能: (幕后是我尝试做的一个 CarFactory - 实现工厂设计模式)
我有一个抽象类“Car”,它具有在所有汽车之间共享的可靠属性,并且我具有并非所有汽车都有的“RadioDisc”、“FuelInjection”等功能。
可能有几种类型的“RadioDisc”或“FuelInjection”。
这些功能中的每一个都遵循一定的模式,具有共同的属性,但在汽车上的安装过程是不同的。
我希望每个功能都基于可以做一些事情的方法对 Car 进行更改。
扩展应该如下所示:
Car myCar = new Car(); //Car is a class which has solid props & List of Feature class
FuelInjection V1 = new FuelInjection();
myCar.Install<FuelInjection>(V1) ;
理想情况下应该这样做,但是我有编译器错误-
扩展方法必须定义在非泛型静态类中
当然我不想要一个通用的静态方法,我想要一个具有相同签名但会在每个继承 Feature 的类上对汽车执行不同操作的方法。
功能示例是为汽车增加成本的 FuelInjection,比方说改进 Car 上的 FuelConsumption 属性。
抽象要素类:
public abstract class Feature
{
internal float _cost;
public float Cost
{
get
{
return _cost;
}
}
public abstract void Install<T>(this Car car) where T : Feature;
}
具体功能:
public class FuelInjection : Feature
{
public new void Install<T>(this Car car) where T : Feature
{
//In iDo some stuff to Car:
car.price += this._cost; //this suppose to be the Feature instance.
//I want to add the cost to property "Price" in Car.
}
}
这在 C# 中是否可行? 可能有不同的方向吗?
【问题讨论】:
-
什么是
MyCar?V1是什么?很难从伪代码中说出你真正想要实现的目标,但我怀疑你还没有真正理解扩展方法。相反,如果您尝试解释您真正想做的事情,那么提供帮助会更容易。 -
我认为您不希望它成为一种扩展方法。只需将其设为常规抽象方法并在您的子类中实现即可。我也怀疑你是否需要它是通用的。
-
不清楚你在问什么。请解释为什么简单地将
Install()方法放在接口声明中是不够的。 -
@JonSkeet 我已经添加了解释。
标签: c# inheritance abstract-class extension-methods