2

Vehicle という抽象クラスを考えてみましょう。この車両には次の抽象的な操作があります
- 開始 - 中断 - 加速

class Vehicle
{
  public:
     virtual void Start() = 0;
     virtual void Break() = 0;
     virtual void Accelerate() = 0;
};

ここで、Vehicle クラスから派生した特別な種類の車両、つまり VehicleA があるとします。

Class VehicleA: public Vehicle
{
   private: 
     double speed;
     double temperature;
     int id;      
     double miles;

   public: 
     void Start();
     void Break();
     void Accelerate();
     void horn();
};

VehicleA タイプとほとんど同じであるが、エンジンのタイプや色などの他の特性がわずかに異なる車両がある場合、クラス階層設計のこのような小さな変更に対応する最善の方法です。するべきか

  • Vehicle クラスから派生した別のクラス VehicleB を定義しますか? また

  • VehicleA から派生した別のクラス VehicleB を定義しますか? また

  • 他の何か?

ありがとう

4

3 に答える 3

2

この場合、継承よりも構成を考慮する必要があります。

クラスVehicleが実際に何を意味するかに応じて (注意してください。この種のクラス設計を行う場合、直観は必ずしも最良の友ではありません。有名な正方形/長方形のケースを考えてみてください)、VehicleA を宣言することができます。次の方法 ( virtual キーワードを忘れないでください):

class VehicleA: public Vehicle
{
   private: 
     //Your specific private
     Engine* m_engine;
     Color* m_color;
     //Add any "modifiable" part as long as it fits 

   public: 
     virtual void Start();
     virtual void Break();
     virtual void Accelerate();
     void horn();
};

EngineColor実装したい詳細を保持する 2 つのクラス (abstract でもなくてもかまいません)。

別のレベルの抽象化を追加します。VehicleAエンジン (独自のインターフェースを備えた) がありますが、その詳細については気にしません (エンジンに車両が対話できるインターフェースがある限り)。新しいタイプのエンジン。

階層を設計するときの原則として、特定のクラスの新しい派生クラスを実装する必要があると思われる場合は、次のことを自問してください。

このクラスは、その親クラスのより具体的なバージョンですか?

あなたの場合、VehicleB は VehicleA のより具体的なバージョンではないように感じますが、それはあなたが何をしたいのかに完全に依存するため、まだ意見の問題です。この場合、進むべき道は合成であるように感じます。

于 2013-06-05T15:55:53.077 に答える
0

わずかに異なるクラスをどのように処理するのですか?

これは、解決しようとしているものに完全に依存します。クラスは実際の車ではなく、実際のVehicleプログラムを作成するために必要な、現実世界の情報に基づいたモデルです。決まったルールではありません。

色について: これはクラスの動作とは関係がないため、可能な場合は無視し、そうでない場合は追加のフィールドを作成します。

エンジンのタイプについて: これは動作に顕著な違いをもたらしますか、それともいくつかのパラメーター (出力、カップル、燃料消費量) を設定するだけの問題ですか? エンジンの場合、車両に含めることができるエンジンの階層を持つことができる可能性が高くなります。

于 2013-06-05T15:52:46.490 に答える