具有一个超类的不同类型的子类对象

时间:2014-12-02 13:40:07

标签: java subclass superclass

所以我有一个超类GeoFig类,以及两个子类Cylinder和Sphere。我想在超类中包含一个方法来计算音量(称为setVolume),但是每个子类都有不同的公式来计算音量。通过子类'构造函数我将setVolume并将获得Volume。我该怎么做?

1 个答案:

答案 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

但我们还没有rh ......

哪些属性描述了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;
}

对任何其他形状重复相同的逻辑过程。