我在理解 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 类作为父类和 Circle 类作为子类,同时 Shape 类是一个抽象类,现在我想在 Circle 类中定义 area 方法 但不是 volume 方法,我想在 Sphere 类中定义 volume 方法。但是当我这样做时,它会显示错误,但如果我在 Circle 类中定义这两个方法,那么它就可以正常工作。但是 Circle 类有额外的体积代码,这不是 Circle 类的使用。
最佳答案
抽象成员不是可选成员。它是一个必须为实现具体类而实现的成员。如果其中一个抽象成员未在派生类中定义,this class is also abstract并且不能被实例化。
这是 Interface Segregation Principle 的一个很好的例子:您的 Shape
接口(interface)结合了不同的可能不相关概念的接口(interface):area()
仅与 2D 形状相关,以及 volume()
仅与 3D 形状相关。
如果你想要一个干净的SOLID设计时,您需要考虑使用 area()
和 perimeter()
的 Shape2D
以及使用一个 surface()
和 volume()
。
如果您认为 area()
实际上与 surface()
相同,您可以考虑抽象父级 Shape
提供了一个抽象的 surface()
,一个子 Shape2D
提供了 perimeter()
和另一个子 Shape3D
提供 volume()
。
更实用的是,您可以将 Circle
或任何其他 2D 形状的 volume()
简单地视为 0 并坚持您的原始设计。
关于java - 在一个具体类中定义所有抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894069/