0

次の場合、有効かつ合法であり、ダウンキャストすることはできますか?

public interface IA {
  string Property1 {get;}
}
public class B {
   public string Name {get;set;}
}

// class A doesn't have it's own fields, all IA methods/properties are implemented through B methods
public class A:B,IA 
{
   public string Property1
   {
      get {return this.Name}
   }
}
.....
B b = new B();
A a = (A)b; // will it work ?

それとも、合成/集約を使用する方が良いですか?

public class A :IA
{
   private B b;
   ....
   public string Property1 {get {return b.Name;} }
   public A(B b) {this.b = b}
}
....
B b= new B();  
A a = new A(b);
4

2 に答える 2

2

A は B であるため、最初の例は機能しません。タイプ B のインスタンスはAかもしれませんが、あなたの場合はそうではありません。キャストは失敗し、実行時に InvalidCastException が発生します。

2 番目の例は、期待どおりにコンパイルおよび実行されるという点で機能します。しかし、実際の問題 (模擬問題ではない) の詳細を知らなければ、これが正しいパターンかどうかはわかりません。

于 2010-12-15T18:20:55.437 に答える
1

いいえ、これは合法ではありません。ACatは anですAnimalが、Animal必ずしも a であるとは限りません (例ではbyとbyにCat置き換えてください)。ACatBAnimal

CatandのAnimal例が再び示すように、合成は意味をなさないかもしれません。構成は通常、「has a」関係用であり、 an にAnimalは a がありませんCat

特定のケースでどのパターンが機能するかは、ドメインの具象型によって異なります。

于 2010-12-15T18:22:29.987 に答える