【问题标题】:Defining all abstract method in one concrete class在一个具体类中定义所有抽象方法
【发布时间】:2019-04-28 19:53:58
【问题描述】:

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

【问题讨论】:

  • volume()引入3DShape - 删除Shape#volume并声明3DShape#volume,其中3DShape extends Shape
  • 那么还有 2 个抽象类吗? 2dShape 类有抽象区域方法和 3dShapte 类有体积抽象方法?
  • 抽象的定义概念是什么?如果我们在一个抽象类中有 3 个抽象方法,那么即使我们需要一两个,我们也必须在具体类中定义它们?
  • 球体和其他 3d 形状具有面积 (surface area),但如果您的要求未指定 3d 形状的面积,那么是的,您可以将其分隔在不同的类之间。将来,如果包括 3d 形状在内的所有形状都需要面积,您可以将该属性移至 Shape。对于您的第二个问题:是的,抽象类要求所有抽象方法都由具体的子类型实现。 Read here for more on abstract classes.

标签: java oop inheritance polymorphism


【解决方案1】:

抽象成员不是可选成员。它是必须为实现具体类而实现的成员。如果其中一个抽象成员未在派生类中定义,this class is also abstract 并且无法实例化。

这是Interface Segregation Principle 的一个很好的例子:Shape 的接口结合了不同的可能不相关概念的接口:area() 仅与 2D 形状相关,volume() 仅与 3D 形状相关.

如果你想要一个干净的SOLID 设计,你需要考虑Shape2Darea()perimeter() 以及Shape3Dsurface()volume()

如果您认为 area() 实际上与 surface() 相同,您可以考虑提供抽象 surface() 的抽象父 Shape,提供 @ 的子 Shape2D 987654338@ 和另一个提供volume() 的孩子Shape3D

更务实的是,您可以考虑 volume()Circle 或任何其他 2D 形状只是 0 并坚持您的原始设计。

【讨论】:

  • 谢谢,所以在第 4 段中,ShapeShape2DShape3D 都应该是抽象的?
  • @AHF 是的,完全正确!
猜你喜欢
  • 2011-06-16
  • 2018-05-12
  • 2012-10-22
  • 2013-05-16
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多