逻辑矛盾是否在类设计中背叛了OOP

Does logical contradicton betrays OOP in class design?

本文关键字:背叛 OOP 矛盾 是否      更新时间:2023-10-16

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

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

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

所有这些继承关系都是假的。一个国家"有"军队,军队"有"技术。因此,他们应该是成员。继承是针对"是"关系。

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

是的,它反对 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();
}
这是一个

错误的设计
当你继承某个类时,它是一种is-a关系。继承不code reuse

您可以为它们常见的行为建立has-a关系。

比如键盘有纽扣,我的衬衫也有,但我的衬衫is not a键盘
所以它也应该设计为shirt has buttonskeyboards has buttons