2011-12-26 13 views
1

したがって、フィールドの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()コンパイラは次のエラーを発行しますので、

  • 「型の不一致:ColorにObjectから変換することはできません」
  • "Object型のメソッドclone()は表示されません。"

この問題の解決策はありますか?

答えて

5
  1. ColorCloneableを実装する必要があります。 CloneableのJavadoc当たり

  2. :慣例により

    、このインタフェースを実装するクラスは、パブリックメソッドで(保護されている) Object.cloneをオーバーライドする必要があります。このメソッドのオーバーライドの詳細については、 Object.clone()を参照してください。

  3. あなたは戻ってColorcolor = (Color)c.clone())へc.clone()の結果をキャストする必要があります - Color上ご上書きclone()方法はあなたのためにこれを行うことができますが。

    Cloneableをを使用して

は、(ここに掲載されている他の回答を参照)、このための最善のアプローチではないかもしれない - しかし、これはあなたが求めているものを提供する必要があります。

+0

おそらく、呼び出し元コードが任意のColor実装(どうやら)とどのように動作するかを考えれば、おそらくこれを実行する最良の方法です。コピーコンストラクタは、Coloneableインターフェイスを実装する良い方法です(つまり 'return new ColorType(this);') – user268396

2

は、あなたのColorクラスでコピーコンストラクタを書く:

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

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

私はクローンまたはCloneableをお勧めしません。

もう1つの考え方は、色を不変にすることです。そういう形で、色の参照を安全に共有することができます。その方法を複製またはコピーする必要はありません。

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'のサブクラスはどうですか?それらが他のフィールドを持っていて、コピーコンストラクタを実装していない場合は? –

+0

サブクラスはコピーコンストラクタを実装する必要があります。すべてのサブクラスにCloneableインタフェースを実装させることと同じです。色が抽象的でなければならない理由を尋ねる。これは通常、あなたの行動が異なることを意味します。どのように色の異なるサブクラスが動作すると思いますか? – duffymo

+0

これはアイデアを伝えるための単なる例です。 –

-1

あなたはをjava.awt.Colorを使用していた場合、あなたは以下を使用できます:

は、念のためにそれはここ不変の色は次のようになります、はっきりしていない

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

として、つまり、抽象的なColorクラスの各具象サブクラスにコピーコンストラクタまたはclone()メソッドを定義する必要があります。

+0

Colorはabstract *と宣言されているため、できません。* Colorは、特定のColorの動作を取得するためのものです。独自のサンプルコードでは、これを理解しています。特定の実装では使用できないメソッドを参照します。たとえば、元の質問には実際には指定されていないgetAlpha()があります。 – user268396

+1

@ user268396 - よろしくお願いします。私は、OPが自分のColorクラスを使用していたことに気付かなかった。私はjava.awt.Colorを見ていました。 :( –

関連する問題