逻辑矛盾是否在类设计中背叛了OOP
Does logical contradicton betrays OOP in class design?
我有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 buttons
和keyboards has buttons
。
相关文章:
- c++中的oop(密码生成)
- OOP 中的单成员指针
- OOP使用不同的结构与孩子一起构建建议
- OOP 标识派生对象
- 标识符Class_name未定义C++ oop
- 返回类型在 C++ OOP 中是什么意思
- 这里的以下 OOP 结构是什么?
- C++ OOP 分段错误
- 对OOP和过程编程做出这样的肯定是正确的吗
- OOP 和字符串指针的奇怪行为
- 异常成员类 OOP
- 从一个类访问私有字段到另一个与C++中的前一个类无关的私有字段 (OOP)
- 关于默认构造函数,对象初始化/使用C++ OOP
- 气泡排序C++ OOP
- OOP 气泡排序C++程序
- 函数与返回类型 node* 与 C++ 中的 OOP 结合使用
- 使用 C++ 和 OOP 创建面积计算程序
- 指针 OOP 操作
- 如何使用OOP运行存储在容器中的实际对象的函数?
- 逻辑矛盾是否在类设计中背叛了OOP