実装クラスのインターフェイスプロパティにアクセスしようとすると問題が発生しています。問題は、実行時に特定の(Cat)型しか持たないため、キャストしようとするとアプリケーションが壊れてしまうことです。ジェネリックスを使用したキャスト
は、ここで私が持っているものだ:型が一致しない場合
public class Animal {}
public class Cat : Animal {}
public interface IPetSitter {}
public interface IPetSitter<T> IPetSitter where T : Animal {
T Pet { get; set; }
}
public class Kid { }
public class NeighborhoodKid : Kid, IPetSitter<Animal> {
Animal Pet { get; set; }
}
// --- Implementation ---
// Kid Timmy is instantiated elsewhere
// Animal type "A" is passed in dynamically
if (Timmy is IPetSitter) {
((IPetSitter<A>)Timmy).Pet = new A();
}
このキャストはエラーになります。
public interface IPetSitter {
object Pet { get; set; }
}
public interface IPetSitter<T> : IPetSitter where T : Animal {
new T Pet { get; set; }
}
// --- Implementation ---
NeighborhoodKid Timmy = new NeighborhoodKid();
((IPetSitter)Timmy).Pet = new Cat();
しかし、これは、[object pet]と[Cat Pet]の両方のプロパティを持つようにIPetSorterを実装するものに強制します。
私は何か考えていただければ幸いです。ありがとう。
UPDATE:私が最初にそれをより明確にしているはずですが、時々私はKid
クラス、時にはNeighborhoodKid
クラスを作成します。だから私はIPetSitter<T>
にキャストする必要があります。私が作った子供はすべて座っているペットになるわけではありません。これは不気味な音を開始しています。
「Timmy.Pet = new Cat();」だけではないのはなぜですか? – SwDevMan81
'NeighborhoodKid'は必ずしも' Pet'プロパティを持っていないので動作しません。それを得るには、ある種の 'IPetSitter'としてそれをキャストする必要があります。 –
Montlebalm