2011-12-26 67 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