Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 我应该用许多派生类创建一个抽象类,还是只创建一个通用类?_Oop_Drawing - Fatal编程技术网

Oop 我应该用许多派生类创建一个抽象类,还是只创建一个通用类?

Oop 我应该用许多派生类创建一个抽象类,还是只创建一个通用类?,oop,drawing,Oop,Drawing,C++我应该用许多派生类创建一个抽象类,还是只创建一个普通类 经典的例子是抽象形状对象,其派生类为Square和Triangle,其中包含特定的几何体和函数 为什么我不创建一个名为Shape的通用类,它包含一个更通用的几何体数据成员来保存动态数量的点,这些点可以是正方形或三角形? 函数可以采用一些参数来指示它是什么类型的形状,例如shape.process(“square”);而不是像Square.process()这样的东西 我的问题清楚吗?这纯粹是一种风格选择吗?它实际上取决于您需要的形状。

C++我应该用许多派生类创建一个抽象类,还是只创建一个普通类

经典的例子是抽象形状对象,其派生类为Square和Triangle,其中包含特定的几何体和函数

为什么我不创建一个名为Shape的通用类,它包含一个更通用的几何体数据成员来保存动态数量的点,这些点可以是正方形或三角形? 函数可以采用一些参数来指示它是什么类型的形状,例如shape.process(“square”);而不是像Square.process()这样的东西


我的问题清楚吗?这纯粹是一种风格选择吗?

它实际上取决于您需要的
形状。例如,如果您只是在绘制它,那么一个普通的
Shape
类从一点到另一点绘制直线将是完美的(无论如何,对于多边形)。但是如果你想计算面积呢。如果
getArea()
函数使用适当的面积公式,那么使用
Square
Triangle
类可能会更容易。没有硬性规定,这完全取决于你需要它们做什么。

一般来说,你无法得到这类问题的答案。这将取决于您试图解决的任何问题的情况和要求。在某些情况下,有一个与派生类的接口是有意义的。在其他情况下,拥有一个通用类是有意义的。如果不知道问题的要求,您将得不到真正的答案。

您应该避免创建“上帝”类来完成大量工作。如果您必须实现许多形状,该怎么办?一个类应该只有一个职责,应该为扩展打开,为修改关闭。检查课堂设计原则或坚实的设计原则。您应该避免复杂的设计和具有多重职责的大型类,因为维护它们或添加额外功能会让您感到痛苦。使用好的设计进行单元测试也会更容易

你真正的问题是什么?你应该尝试解决一个特定的情况,不在任何地方应用一般规则。这不是C++特有的问题,是一个通用的OOP委托问题。另一方面,实际的C++设计并没有这样做。在大多数情况下,C++不是OOP,是多范式的,是通用的。在这种情况下(绘图系统),我永远不会执行基于动态绑定的/OO层次结构:存在性能问题(缓存和vtables不是好朋友),并且存在大量耦合(绘图系统与实体系统耦合太多)。只有在运行时才真正知道所需的实际类型时,才应使用多态类层次结构。如果您已经在编译时了解了所有内容,则不需要动态多态性。在帮助部分中明确禁止此类问题。这不是意见问题。@xaxxon可以肯定这是一个主观问题,但我的目的不是收集意见,而是为解决设计问题提供指导。有趣的是,我从未听说过SOLID;我会查出来的谢谢!这个推理是否导致我得出结论,我需要一个小矩形、中矩形、sqrt(2)大小的矩形、大矩形等的类?我很难看出区别在哪里。不,这不应该让你得出那个结论。整个想法是遵循“一吻而过”的方法(保持简单、愚蠢或面对挫折)。为不同大小的矩形(所有矩形都有相同的数据成员和方法)提供单独的类并不能保持简单,其目的是提供一些易于维护、可读的内容。在大多数情况下,遵循这些原则可以简化操作。