9

から派生したいくつかの抽象 Vehicleクラスと車、トラック、オートバイの抽象クラスがあると考えてくださいVehicle。また、トラックやオートバイ用にも、燃料ベースの車や電気ベースの車などを作成できなければならないことを想像してみてください。(具体的なクラス)

2つの質問:

1.車のエネルギーを、それが何であるかを知らずに、多形的に満たしたいと考えてください。たとえば、車両が燃料ベースの場合、燃料を充填したいので、メソッドは3つのパラメーターを使用する必要があります。
void FillUpEnergy(EfuelType i_fuelType,int amounOfEnergy, int maxAmountOfEnergy)

しかし、電気ベースの車両の場合、ほぼ同じ機能署名が必要ですが、今回はもちろん燃料タイプなしです。たとえば、(2つのパラメーター):

void FillUpEnergy(int amounOfEnergy, int maxAmountOfEnergy) 

FillUpEnergy上記の制約で多形法を行うことはできますか?(異なるメソッドのシグネチャ)

2.私の実装では、すべての具象クラスは、または(Engineから派生した他の具象Engineクラス)を表す(別の抽象クラス)の参照を保持します。たとえば、の参照を保持するという名前の具象クラスがあります。 このアーキテクチャは十分に優れていますか、それともガレージシステムを実装するためのより良い方法がありますか?(オブジェクト指向デザインなどに関して)FuelEngineElectricEngineElectricCarElectricEngine

4

5 に答える 5

10

異なるシグネチャを使用してポリモーフィックな「プッシュスタイル」メソッドを作成することはできませんが、広く知られているビジターパターンを使用してポリモーフィックな「プルスタイル」メソッドを作成することはできます。

アイデアは、相互作用の順序を逆にして、車のオブジェクトに何をすべきかを決定させることです。車に必要だと思うものを呼び出しFillUpEnergy与えるFillUpEnergy代わりに、次のように、車電話して、必要だとわかっているものを受け取らせます。

interface IEnergyProvider {
    void TakeFuel(EfuelType i_fuelType, int amounOfEnergy);
    void TakeElectricity(int amounOfEnergy);
}
interface ICar {
    void FillUpEnergy(IEnergyProvider provider);
}

これで、ポリモーフィックメソッドのシグネチャが修正されましたが、メソッドのディスパッチには1つではなく2つのレッグが必要です。

  • あなたが呼ぶmyCar.FillUpEnergy(myProvider)
  • 車が呼ぶmyProvider.TakeFuelmyProvider.TakeElectricity
于 2012-08-06T21:52:59.263 に答える
4

質問1について)

電気/ガソリンを燃料タイプの一部にして、ドメインロジックでこれを処理することができます。

C#は、異なるシグネチャを持つポリモーフィズムを提供しません。

2)コンポジションと呼ばれます

于 2012-08-06T21:44:32.883 に答える
2

ElectricCarとの違いは何FueledCarですか?エンジン以外は何もありません(概念的に):

interface IEngine
{
    void FillUpFuel(int amountOfFuel, int maxAmountOfFuel);
}

class ElectricEngine : IEngine
{
    public void FillUpFuel(int amountOfFuel, int maxAmountOfFuel) { ... }
}

abstract class Vehicle
{
    public abstract IEngine Engine { get; }
}

class Car : Vehicle
{
    public IEngine _engine;
    public override IEngine Engine { get { return _engine; } }

    public Car(IEngine engine)
    {
        _engine = engine;
    }
}
...
var electricCar = new Car(new ElectricEngine());
electricCar.Engine.FillUpFuel(40, 70);

典型的な構成と継承の例。ElectricEngineが燃料を満タンにするので、命名は少し奇妙です...しかし、それは重要ではありません。

于 2012-08-06T21:52:10.853 に答える
0

約1)ポリモーフィック(サブタイプポリモーフィズム
) を持つことのポイントは、オブジェクトがであることがわかっている場合にのみ、このメソッドを呼び出せるようにすることです。 FillUpEnergyVehicle

正しい引数のセットを選択するために正確な型を知る必要がある場合は、この関数が多型である必要はありません。

約2)
衝撃的なことは何もありません

于 2012-08-06T21:52:41.427 に答える
-1
  1. それはまさにカプセル化の違反になるので、それを行うことはできません。
  2. エンジンについての質問はわかりませんが、「ガレージシステム」がたくさんあるからといって、「ガレージシステム」をもっとうまく実装できる方法はたくさんあると思います。これは、実際には、要件を十分に把握するまで、システムを(OOPまたはその他の用語で)モデル化しようとすべきではないことを意味します。
于 2012-08-06T21:47:23.980 に答える