在一个具体的类中定义所有抽象方法

时间:2019-04-28 19:53:59

标签: java oop inheritance polymorphism

我在理解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类。

1 个答案:

答案 0 :(得分:3)

抽象成员不是可选成员。它是实现具体类所必须实现的成员。如果未在派生类中定义抽象成员之一,则this class is also abstract不能实例化。

这是Interface Segregation Principle的一个很好的例子:Shape的界面结合了不同的潜在不相关概念的界面:area()仅与2D形状有关,而{{1 }}仅与3D形状有关。

如果您想要干净的SOLID设计,则需要考虑将volume()Shape2Darea()perimeter()与{{ 1}}和Shape3D

如果您认为surface()实际上与volume()是同一回事,则可以考虑提供抽象area()的抽象父母surface(),即孩子提供Shape的{​​{1}}和提供surface()的另一个孩子Shape2D

从实用性上讲,您可以考虑perimeter()或任何其他2D形状中的Shape3D只是0,并坚持您的原始设计。