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();
      :
      :
}

假设这种继承适合我的解决方案。但是正如你所看到的,当我从 Country 创建 Military 时,它们之间在逻辑上没有关系。我的意思是,军队不是一个国家。同样对于来自国家的技术,问题也是一样的。技术不是军队,也不是国家。

无论如何,这个解决方案对我来说没问题,它缩短了我的代码,但是如果我这样做,我是否背叛了面向对象的编程哲学?是矛盾的吗?

4

3 回答 3

9

所有这些继承关系都是错误的。一个国家“有”军队,一个军队“有”技术。因此,他们应该是成员。继承是为了“是一种”关系。

如果您颠覆了语言结构的预期含义,您可能会在以后为此付出代价。

于 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 回答