0

私は3つのクラスを持っています。それらはすべて類似した整数、メソッドなどを持っています...

class Country{

      int a,b;
public:
      Country();
      void doSomething();
      :
      :
}

class Military : public Country {
public:
      Power();
      void doAnother();
      void doAnother2();
      :
      :
}

class Technology : public Military{
public:
      Technology();
      void doAnother3();
      :
      :
}

この継承が私のソリューションに適していると仮定します。しかし、ご覧のとおり、国から軍隊を作成する場合、論理的にはそれらの間に関係はありません。つまり、軍隊は国ではありません。国の技術についても、問題は同じです。テクノロジーは軍隊でも国でもありません。

とにかく、その解決策は私にとっては大丈夫です、それは私のコードを短くします、しかし私がこれをするならば、私はオブジェクト指向プログラミング哲学を裏切りますか?それは矛盾ですか?

4

3 に答える 3

9

これらの継承関係はすべて偽です。国は「軍隊を持っている」、そして軍隊は技術を「持っている」。したがって、彼らはメンバーでなければなりません。継承は「isa」関係のためのものです。

言語構造の意図された意味を覆す場合、おそらく後でそれを支払うでしょう。

于 2012-04-17T15:01:04.303 に答える
4

はい、それはOOPに反対です。あなたの関係はhas-a、ではありませんis-a

これには、継承ではなく構成を使用する必要があります。

class Country{
      Military m;  //Country has-a military
      int a,b;
public:
      Country();
      void doSomething();
}

class Military{
      Technology t; //Military has-a technology
public:
      Military();
      void doAnother();
      void doAnother2();
}

class Technology{
public:
      Technology();
      void doAnother3();
}
于 2012-04-17T15:00:55.030 に答える
1


あるクラスを継承している場合、そのis-a関係は間違った設計です。継承はそうではありませんcode reuse

has-aあなたは彼らと共通の行動のための関係を確立することができます。

キーボードのようにボタンがあり、シャツにもあります。しかし、私のシャツのis not aキーボード。
したがって、それも同様に設計する必要がshirt has buttonsありkeyboards has buttonsます。

于 2012-04-17T15:02:34.337 に答える