我在理解OOP的主要主题时遇到了重大问题。虽然我读过迪特尔的书。我有一个抽象的类形状。
public abstract class Shape
{
public abstract area();
public absract volume;
}
public class Circle extends Shape
{
//definition of area method
}
public class Sphere extends Shape
{
//define volume method
// define area method
}
现在,由于我将Shape类作为Parent类,而将Circle类作为子类,同时Shape类是一个抽象类,现在我想在Circle类中定义 area方法,而不是volume方法,我想在Sphere类中定义体积方法。但是,当我这样做时,它向我显示了错误,但是如果我在Circle类中定义了这两种方法,那么它将正常工作。但是,Circle类具有多余的音量代码,没有使用Circle类。
答案 0 :(得分:3)
抽象成员不是可选成员。它是实现具体类所必须实现的成员。如果未在派生类中定义抽象成员之一,则this class is also abstract不能实例化。
这是Interface Segregation Principle的一个很好的例子:Shape
的界面结合了不同的潜在不相关概念的界面:area()
仅与2D形状有关,而{{1 }}仅与3D形状有关。
如果您想要干净的SOLID设计,则需要考虑将volume()
与Shape2D
和area()
和perimeter()
与{{ 1}}和Shape3D
。
如果您认为surface()
实际上与volume()
是同一回事,则可以考虑提供抽象area()
的抽象父母surface()
,即孩子提供Shape
的{{1}}和提供surface()
的另一个孩子Shape2D
。
从实用性上讲,您可以考虑perimeter()
或任何其他2D形状中的Shape3D
只是0,并坚持您的原始设计。