因此,我们有一个类,其中一个字段是抽象类的类型。我们想编写一个构造函数,以便不会出现别名;即我们不想引用构造函数获取的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()
,因为编译器会发出以下错误:
那么,这个问题的可能解决方案是什么?
答案 0 :(得分:5)
Color
需要实施Cloneable
。
根据Cloneable
Javadoc:
按照惯例,实现此接口的类应该重写 使用公共方法的Object.clone(受保护)。看到 Object.clone()有关重写此方法的详细信息。
您需要将c.clone()
的结果转发回Color
(color = (Color)c.clone()
) - 尽管clone()
上被覆盖的Color
方法可以执行这适合你。
使用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()
方法。