2016-08-01 5 views
1

私は疑問に思っていました(これは繰り返しの質問ですが、私の質問に関する具体的な情報は見つかりませんでした)タイプ。ここに私の特定のシナリオです:親タイプまたは子タイプを返すことの違い

は、次のクラスとインターフェイスを想像:

public Color getRGB() {return new RGBColor();} 

:私はメソッドを含めるようにした場合

public interface Color{ 
    public int getRedVal(); 
    public int getGreenVal(); 
    public int getBlueVal(); 
} 
public class RGBColor implements Color{ 
    public int getRedVal() {...} 
    public int getGreenVal() {...} 
    public int getBlueVal() {...} 
} 
public class HSVColor implements Color{ 
    public int getRedVal() {...} 
    public int getGreenVal() {...} 
    public int getBlueVal() {...} 
} 

は今、違いがどうなるか、getRGB()と呼ばれますと

public RGBColor getRGB() {return new RGBColor();} 

私はドキュメントを見つけることはできませんでした私はそれが簡単な答えだと確信しています。いずれにせよ、答えに事前に感謝します。

+0

「[インターフェイスにプログラムする」とはどういう意味ですか?](http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-インタフェース) – bradimus

答えて

2
public Color getRGB() { return new RGBColor(); } 

アップキャストはここにあります(スーパータイプへのキャスト)。あなたは実装について考えないより抽象的なレベルで作業しています(何が良いですか)、そして親のメソッドだけを使うことができます。

public RGBColor getRGB() { return new RGBColor(); } 

あなたとあなたのアーキテクチャでは、実装(RGBColor)に強固に結合しているが、このサブクラスで定義された特定のメソッドを使用することができます。

私は第2のオプションではなく第1のオプションを好みます。

0

まず、ファクトリメソッドを静的にする必要があります。

2つ目の方法の違いは、宣言された戻り値の型です。あなたは二つの定義の最初を使用した場合、プログラマが記述します。

Color c = getRGB(); // this is legal 

を彼らは書くことができませんでした:

RGBColor c = getRGB(); // This is illegal 
0

をあなたは正しくインターフェースにコード化した場合に大きな違いはありません。ただし、その違いは単純に参照型です。あなたは戻り値の型Colorから得られるが、あなたは戻り値の型RGBColorを使用することができれば、インスタンス上でこのメソッドを呼び出すことができないだろう

public int[] getRGBFormatVals() //I dunno; I made it up! 

と仮定RGBColorは、追加のパブリックメソッドを持っていました。私の前の言い分を言い換えると、インタフェースに正しくコード化していれば、これは起こりそうにありません。

あなたのメソッドはgetRGBと呼ばれているので、RGBColorを返すことをお勧めします。そのような名前のメソッドから返されるべきものがすべてあるからです。同じ効果を持ち、結果を見るには、Color参照に簡単に割り当てることもできます。

関連する問題