2012-08-06 3 views
7

抽象Vehicleクラスと車、トラック、オートバイ抽象クラスVehicleから派生したものを考えてみましょう。また、私は燃料や燃料をベースにした車や電動ベースの車などを作成することができることを想像してトラックやバイクのためにも。 (具象クラス)異なるシグネチャで多態的な方法を作るにはどうすればいいですか

つの質問:

1.Consider私は多型の方法で、それが何であるかを知らなくても、車両のエネルギーをいっぱいにしたいです。例えば車両が、私は燃料とそれを埋めるために、メソッドが3つのパラメータである必要があり欲しい系燃料の場合:
void FillUpEnergy(EfuelType i_fuelType,int amounOfEnergy, int maxAmountOfEnergy)

しかしelectricy基づいて、車両のために、私はの燃料タイプなしで、ほぼ同じ機能signtureが、この時間を必要としますもちろん、例えば(2つのパラメータ):

void FillUpEnergy(int amounOfEnergy, int maxAmountOfEnergy) 

私は上記の制約とpolymorhic FillUpEnergy方法を行うことができますか? (異なるメソッドのシグネチャ)すべての具象クラスがFuelEngineまたはElectricEngine(エンジンから派生し、私が持っている他の具体的なクラス)を表すEngineのための参照(別の抽象クラス)を保持し、私の実装2.In

。たとえば、ElectricEngineの参照を保持する具体的なクラスElectricCarがあります。
このアーキテクチャは十分ですか、またはガレージシステムを実装するためのより良い方法がありますか?

+1

を呼び出しmyCar.FillUpEnergy(myProvider)

  • を呼び出す)、それが橋と呼ばれ、それがデザインパターンの一つですです。 –

  • +0

    ブリッジパターンも私の最初の考えでした。 –

    答えて

    8

    あなたは異なるシグネチャを持つ多型「プッシュスタイル」の方法を作ることはできませんが、広く公表Visitor Patternを使用して多型「プルスタイル」メソッドを作ることができます。

    アイデアが相互作用の順序を反転し、車のオブジェクトが何をすべきかを決定できるようにすることです:代わりにあなたはそれが必要だと思うものをに車を与えFillUpEnergyを呼び出す、FillUpEnergyを呼び出し、車何を見てみましょう今すぐあなたの多型メソッドのシグネチャが固定されている

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

    が、この方法の発送は1つではなく、2本の足を取る:それはこのように、それが必要と知っている

    • あなたは2に関しては)車は、私はかなりの1を取得しないmyProvider.TakeFuelまたはmyProvider.TakeElectricity
    +2

    素敵な答え! – dash

    +1

    しかし、古いアバターを見逃していますが、ここでは不要な複雑な訪問者ではありませんか?電気を取って、同じコンセプトのような他の種類の燃料音を鳴らすことに関して... –

    +0

    @セバスチャンあなたは訪問者のパターンについて絶対に正しいです:それは容易に手を伸ばすことができます、特にあなたが拡張性を維持する必要がある場合。しかし、このような前向きに指定できる階層の場合、大きな問題ではありません。ほんの一握りの方法で、あなたの心の中の相互作用を歩いていくのは簡単です。ガスと電気を同じコンセプトにしている限り、私はデザインが単一の 'FillUpEnergy'メソッドを提供することによってそれを反映していると思います。 – dasblinkenlight

    3

    について質問1)

    (オブジェクト指向設計など。の面で)あなたはfueltypeの電気/ガソリン部分を作ることができるし、ドメインロジックでこれを取り扱います。

    C#では、異なるシグネチャで多型を提供していません。それはカプセル化の正確違反になるので

    2)は、作曲

    0
    1. あなたはそれを行うことはできませんと呼ばれています。
    2. 私はエンジンに関するあなたの質問を理解していませんが、非常に多くの異なる「ガレージシステム」があるという理由だけで、「ガレージシステム」を実装するためのより良い方法がたくさんあると確信することができます。実際には、要件をよく理解するまでは、システムをモデル化しないでください(OOPやその他の用語に関して)。
    1

    ElectricCarFueledCarと何が区別されますか?エンジン以外の概念(概念的に):

    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が燃料をいっぱいにしていると、ネーミングはちょっと奇妙です...それはポイントではありません。

    0

    多型FillUpEnergysubtype polymorphismを持つの約1)
    点)は、あなたが知っている唯一のことは、オブジェクトがVehicleであるということであるときに、このメソッドを呼び出すことができるようにすることです。

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

    について2)
    何もショッキング

    関連する問題