-4
public class CircleGeometricObject extends GeometricObject  {

    private double radius;

    public CircleGeometricObject() {}
    public CircleGeometricObject(double radius) {
        this. radius = radius;
    }
    public CircleGeometricObject(double radius, String color, boolean filled) {
        this. radius = radius;
        setColor(color);
        setFilled( filled);
    }
}
4

3 回答 3

3

如果您想减少代码重复,您可以执行以下操作(尽管添加一些空值检查)。对于您的示例,它可能超出了顶部,但对于具有大量代码的构造函数来说,减少重复可能很有用。

public class MyClass {
    private Double radius;

    public MyClass() {
        this(null, null, null);
    }

    public class MyClass(Double radius) {
        this(radius, null, null)
    }

    public class MyClass(Double radius, String colour, boolean filled) {
        this.radius = radius;
        setColour(colour);
        setFilled(filled);
    }
}

** 编辑将 double 更改为 Double 以允许 null

于 2013-04-19T20:36:16.997 回答
1

我不确定是否能正确理解这个问题。你问为什么你必须重写GeometricObject 的构造函数?

以下代码编译不是强制性的:

public class CircleGeometricObject extends GeometricObject
{
private double radius;

public CircleGeometricObject(double radius, String color, boolean filled)
{
    this.radius = radius;
    setColor(color);
    setFilled(filled);
}
}    

您实现所需的构造函数。

于 2013-04-19T20:46:05.483 回答
0

不得不创建一个测试用例,因为它已经很长时间了,而且这总是一种模糊的区域:

public class ConstrTest {
    protected String fieldA;
    protected String fieldB;
    public static void main(String[] argV) {
        ConstrTestSub sub1 = new ConstrTestSub("111", "222");
        sub1.print();
        // ConstrTestSub sub2 = new ConstrTestSub();
        // sub2.print();
    }
    public ConstrTest() {
        this("ABC","XYZ");
    }
    public ConstrTest(String a) {
        this(a, "YYY");
    }
    public ConstrTest(String a, String b) {
        fieldA = a;
        fieldB = b;
    }
    public void print() {
        System.out.println("fieldA = " + fieldA + ", fieldB = " + fieldB);
    }
}

class ConstrTestSub extends ConstrTest {
    private String fieldC;
    public ConstrTestSub(String a, String b) {
        super(a, b);
        fieldC = "QQQ";
    }
    public void print() {
        System.out.println("fieldA = " + fieldA + ", fieldB = " + fieldB + ", fieldC = " + fieldC);
    }
}

上面的代码编译并运行良好,并且 ConstTestSub 构造函数适当地执行相应的版本(即使没有显式调用super它也会这样做)。super

但是,如果您取消注释new ConstTestSubmain 中的第二个,它将不会编译,因为()未定义构造函数的版本。

所以,如果你要定义你的构造函数,并且如果你需要多个表单,你必须定义所有你需要的表单。(当然,如果足够的话,它们可以级​​联。)

于 2013-04-19T20:59:44.383 回答