更改继承类中的抽象方法签名

Mul*_*der 11 c# abstract-class virtual-functions abstract-methods

想象一下,我有一个名为Engine的类作为抽象基类.我也有ElectrictEngine和FuelEngine类来自它.

我想创建一种为引擎加油的方法.我应该将它作为基类级别的抽象方法,并将其命名为通用的fasion,例如fillUpEnergy?

问题是如果我有一个电动引擎,该方法所采用的参数数量与燃料引擎需要传递的参数数量不同.因此,该方法的签名是不同的.

另外,是否有任何智能方法可以为两个引擎使用泛型方法,但是将它包装在一个更具体的名称中?例如:对于燃料发动机,"加油",对于电动发动机,"chargeBattery"?同时隐藏用户的通用方法?

Tej*_*ejs 6

在这种情况下,我将定义一个抽象类的泛型实现,这样你就可以得到这样的结果:

public abstract class EngineBase<T>
{
     public abstract void Refuel(T parameters);
}
Run Code Online (Sandbox Code Playgroud)

然后你的实现看起来像这样:

public class ElectricEngine : EngineBase<ElectricParameters>
{
     public override void Refuel(ElectricParameters parameters) { }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以定义接口,并将特定实现传递给您的方法:

public abstract class EngineBase
{
     public abstract void Refuel(IRefuelParameters parameters);
}
Run Code Online (Sandbox Code Playgroud)

然后你的实现看起来像这样:

public class ElectricEngine : EngineBase
{
     public override void Refuel(IRefuelParameters parameters)
     {
          if(!(parameters is ElectricParameters))
              throw ApplicationException("Not the right params!");

          ElectricParameters rightParams = parameters as ElectricParameters;
     }
}
Run Code Online (Sandbox Code Playgroud)


n8w*_*wrl 2

多考虑一下您将如何使用这些类。如果您的客户不知道他们正在处理哪种发动机 - 他们有一个“发动机”,那么您必须找出双方可以使用的“加油”签名。另一方面,如果您必须为每种加油使用不同的参数,那么您就无法在基类中执行任何操作,而必须让您的客户知道它是什么类型的引擎并传递正确的参数。