如何使用不同的签名创建多态方法

Jav*_*aSa 8 c# oop polymorphism inheritance

考虑我有一些抽象的 Vehicle类和汽车,卡车,摩托车抽象类派生自Vehicle.还想象一下,我必须能够为卡车和摩托车制造基于燃料的汽车或电动汽车等.(具体课程)

两个问题:

1.考虑到我想以多态的方式在车辆中充满能量而不知道它是什么.例如,如果车辆是基于燃料的,我想用燃料填充它,方法应该有3个参数:
void FillUpEnergy(EfuelType i_fuelType,int amounOfEnergy, int maxAmountOfEnergy)

但对于电动车辆,我需要几乎相同的功能,但这次当然没有燃料类型,例如(2个参数):

void FillUpEnergy(int amounOfEnergy, int maxAmountOfEnergy) 
Run Code Online (Sandbox Code Playgroud)

我可以FillUpEnergy用上述约束做一个多态方法吗?(不同方法的签名)

2.在我的实现中,所有具体类都有Engine(另一个抽象类)的引用,它代表一个FuelEngineElectricEngine(我从Engine派生的其他具体类).例如,我有一个名为的具体类ElectricCar,它包含一个引用ElectricEngine.
这种架构是否足够好或是否有更好的方法来实施车库系统?(在面向对象设计等方面......)

das*_*ght 9

您不能使用不同的签名制作多态"推式"方法,但您可以使用广为人知的访客模式制作多态"拉式"方法.

我们的想法是反转相互作用的序列,并让汽车对象决定做什么:而不是调用的FillUpEnergy,并给予什么车,你觉得需要,打电话FillUpEnergy,让车它知道它需要,就像这样:

interface IEnergyProvider {
    void TakeFuel(EfuelType i_fuelType, int amounOfEnergy);
    void TakeElectricity(int amounOfEnergy);
}
interface ICar {
    void FillUpEnergy(IEnergyProvider provider);
}
Run Code Online (Sandbox Code Playgroud)

现在你的多态方法的签名是固定的,但是方法的派遣需要两条腿而不是一条腿:

  • 你打电话 myCar.FillUpEnergy(myProvider)
  • 汽车电话myProvider.TakeFuelmyProvider.TakeElectricity

  • 很好的答案!虽然错过了旧的化身 (2认同)