如何构造一个具有抽象类类型字段的对象?

时间:2011-12-26 02:23:21

标签: java abstract-class

因此,我们有一个类,其中一个字段是抽象类的类型。我们想编写一个构造函数,以便不会出现别名;即我们不想引用构造函数获取的Color对象,而是复制它,并将副本分配给Color字段。

class Shape {
    private Color color; /* Color is an abstract class */

    public Shape(Color c) {
       /* How do we assign a clone
          of `c` into `color`? */
    }

    /* Methods */
    ...
}

abstract class Color {
    private String colorModel;
    private float transparency;

    /* Methods */
    ...
}

我们无法使用color = c.clone(),因为编译器会发出以下错误:

  • “类型不匹配:无法从对象转换为颜色。”
  • “Object类型的方法clone()不可见。”

那么,这个问题的可能解决方案是什么?

3 个答案:

答案 0 :(得分:5)

  1. Color需要实施Cloneable

  2. 根据Cloneable Javadoc:

      

    按照惯例,实现此接口的类应该重写   使用公共方法的Object.clone(受保护)。看到   Object.clone()有关重写此方法的详细信息。

  3. 您需要将c.clone()的结果转发回Colorcolor = (Color)c.clone()) - 尽管clone()上被覆盖的Color方法可以执行这适合你。

  4. 使用Cloneable可能不是最佳方法(请参阅此处发布的其他答案) - 但这应该提供您所要求的内容。

答案 1 :(得分:2)

在Color类中编写一个复制构造函数:

abstract class Color {
    private String colorModel;
    private float transparency;

    public Color(Color c) {
        this.colorModel = c.colorModel;
        this.transparency = c.transparency;
    }
}

我不推荐克隆或Cloneable

另一个想法是使Color不可变。您可以安全地在Shapes之间共享Color引用;无需克隆或复制那种方式。

以防万一不清楚,这就是不可变颜色的样子:

public final class Color {
        private final String colorModel;
        private final float transparency;

        public Color(String colorModel, float transparency) {
            this.colorModel = colorModel;
            this.transparency = transparency;
        }

        public String getColorModel() { return this.colorModel; }
        public float getTransparency() { return this.transparency; }
}

答案 2 :(得分:-1)

如果您使用的是java.awt.Color,则可以使用以下命令:

this.color = new Color(c.getColorSpace(), c.getColorComponents(), c.getAlpha());

实际上,您需要在抽象Color类的每个具体子类中定义复制构造函数或clone()方法。