2011-12-26 33 views
1

所以,我们有一个类,它的一个领域是抽象类。我们想写一个构造函数,以便不会出现锯齿;即我们不想引用构造函数获取的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()不可见。”

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

回答

5
  1. Color需要执行Cloneable

  2. Cloneable的Javadoc:

    按照惯例,实现此接口应该覆盖 Object.clone(它是受保护)与公共方法的类。有关覆盖此方法的详细信息,请参阅 Object.clone()。

  3. 你需要转换的c.clone()结果回Colorcolor = (Color)c.clone()) - 虽然在Color您覆盖clone()方法可以为你做到这一点。

使用克隆可能不是最好的方法(请参阅其他答案张贴在这里) - 但这应该提供你所要求的。

+0

考虑到调用代码如何与任意Color实现(显然)一起工作,可能是最好的方法。反过来,拷贝构造函数将是实现Coloneable接口的一种好方法(即:''return new ColorType(this);') – user268396 2011-12-26 02:43:15

2

写拷贝构造函数在你的颜色类:

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

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

我不建议克隆或Cloneable

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

以防万一它是不明确的,这里是不可变的颜色看起来像:

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; } 
} 
+0

但是Color的子类呢?如果他们有其他领域,并没有实现复制构造函数? – 2011-12-26 02:34:41

+0

子类必须实现复制构造函数;与强制所有子类实现Cloneable接口无异。我会问为什么颜色是抽象的。这通常意味着你有不同的行为。你如何期望Color的不同子类表现? – duffymo 2011-12-26 02:37:06

+0

这只是一个传达想法的例子。 – 2011-12-26 02:39:22

-1

如果您正在使用java.awt.Color中,你可以使用以下命令:

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

由于它是,您将需要在抽象Color类的每个具体子类中定义一个拷贝构造函数或clone()方法。

+0

不可以,因为Color被声明为abstract *和* subclassing Color的全部原因是获取特定的Color行为。您自己的示例代码承认了这一点:您指的是可能不适用于特定实现的方法,如在原始问题中实际没有指定的'getAlpha()'。 – user268396 2011-12-26 02:46:03

+1

@ user268396 - 糟糕。我没有注意到OP在使用他自己的Color类;我正在查看java.awt.Color。 :( – 2011-12-26 02:56:25

相关问题