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

标签 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 类作为父类和 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/

相关文章:

JavaFX 使用 CellFactory 将图像放入 TableView

java - jaxb 生成的 ObjectFactory 方法

java - OOP的缺点?

java - 装饰器设计模式不明确

java构造函数分配整个类而不仅仅是字段

php - 如何创建一个 "genuinely extensible"类

javascript - 通过对象组合保持自身属性私有(private)

java - 相当于java中扩展final类来添加额外的功能

c# - 自动对类执行操作且仅执行一次的方法

c++ - 假设派生类的指针与第一个基类的指针相同有多安全?