考虑我有一些抽象的汽车类和汽车,卡车,摩托车抽象类派生自车辆.还想象一下,我必须能够为卡车和摩托车创造一种基于燃料的汽车或电动汽车等. (具体课程)
两个问题:
1.考虑到我想以多态的方式在不知道它是什么的情况下在车辆中填充能量.例如,如果车辆是基于燃料的,我想用燃料填充它,方法应该有3个参数:
void FillUpEnergy(EfuelType i_fuelType,int amounOfEnergy,int maxAmountOfEnergy)
但对于电动车辆,我需要几乎相同的功能,但这次没有燃料类型,例如(2个参数):
void FillUpEnergy(int amounOfEnergy,int maxAmountOfEnergy)
我可以使用上述约束来执行多态FillUpEnergy方法吗? (不同方法的签名)
2.在我的实现中,所有具体类都包含Engine(另一个抽象类)的引用,它代表FuelEngine或ElectricEngine(我从Engine获得的其他具体类).例如,我有一个名为ElectricCar的具体类,它拥有ElectricEngine的参考.
这种架构是否足够好或是否有更好的方法来实施车库系统?
(在面向对象设计等方面……)
解决方法
您不能使用不同的签名制作多态“推式”方法,但您可以使用广为人知的
Visitor Pattern制作多态“拉式”方法.
我们的想法是颠倒交互的顺序,让汽车对象决定做什么:不要打电话给FillUpEnergy并给汽车你认为它需要的东西,而是叫FillUpEnergy让汽车接受它所需要的东西,如下所示:
interface IEnergyProvider { void TakeFuel(EfuelType i_fuelType,int amounOfEnergy); void TakeElectricity(int amounOfEnergy); } interface ICar { void FillUpEnergy(IEnergyProvider provider); }
现在你的多态方法的签名是固定的,但是方法的派遣需要两条腿而不是一条腿:
>你打电话给myCar.FillUpEnergy(myProvider)>汽车调用myProvider.TakeFuel或myProvider.TakeElectricity