所以我有一个超类GeoFig类,以及两个子类Cylinder和Sphere。我想在超类中包含一个方法来计算音量(称为setVolume),但是每个子类都有不同的公式来计算音量。通过子类'构造函数我将setVolume并将获得Volume。我该怎么做?
答案 0 :(得分:1)
我的Java 非常生锈,所以请将此处的任何代码视为伪代码,以便演示概念......
您没有正确地在代码中对对象进行建模。代码应该与正在建模的现实世界概念相匹配。所以让我们考虑那些现实世界的概念。
什么是GeoFig
?
一个人看起来像什么?如果你手里拿着一个,它会是什么形状?没有答案,因为它不是具体的对象。它是概念性或抽象对象。所以它应该是一个抽象类:
abstract class GeoFig { }
哪些属性描述了GeoFig
?
它有长度吗?宽度?半径?不是,不是。但是为了成为三维空间中的对象,我们可以假设它有一个体积。我们只是不知道如何计算这个数量:
abstract class GeoFig {
abstract double getVolume();
}
现在我们有了父类。
什么是Cylinder
?
它是一个具有卷的几何对象,因此我们可以从父类继承:
class Cylinder inherits GeoFig {
public double getVolume() {
return 0;
}
}
我们如何计算Cylinder
的数量?
π * r^2 * h
但我们还没有r
或h
......
哪些属性描述了Cylinder
?
它有一个高度和一个半径。事实上,必须才能存在这些。所以它需要它们用于对象构造:
class Cylinder inherits GeoFig {
private final double height;
private final double radius;
public Cylinder(double height, double radius) {
this.height = height;
this.radius = radius;
}
public double getHeight() {
return this.height;
}
public double getRadius() {
return this.radius;
}
double getVolume() {
return 0;
}
}
(这假定不变性。如果您希望能够更改Cylinder
的尺寸,请进行适当的更改。)
现在我们还可以计算音量:
double getVolume() {
return Math.PI * this.radius * this.radius * this.height;
}
对任何其他形状重复相同的逻辑过程。