インターフェイスの (反?) 分散が答えのように感じますが、適切な解決策が見つかりません。
これらのクラスを用意しましょう:
public abstract class Fruit { }
public class Banana : Fruit { }
public class Apple : Fruit { }
public abstract class Picture { }
public class FruitPicture<T> : Picture, Contravariant<T>, Covariant<T> where T : Fruit
{
T myFruit = null;
public Type GetFruitType() { return typeof(T); }
public void AddFruit(T fruit) { this.myFruit = fruit; }
}
public interface Contravariant<in T> { void AddFruit(T model); }
public interface Covariant<out T> { Type GetFruitType(); }
私の状況は:
次の 2 つのように、既に初期化されている Bananas と Apples のコレクションがあります (ただし、別のものを使用できます)。
Fruit[] myFruits = new Fruit[2] { new Banana(), new Apple() };次の 2 つの写真のコレクションがあります。
Picture[] myPictures = new Picture[2] { new FruitPicture<Banana>(), new FruitPicture<Apple>(), };
今、私は非常に単純なことをしようとしていますが、用途の広い方法で、つまり、新しい果物が見つかり、新しい FruitPicture がコレクションに表示されるたびにコードを変更する必要があるスイッチ/if を避けたい =>.AddFruit()コレクションから適切な種類の FruitPicture に移動したいと考えています。ほとんどすべてのロジックを変更できますが、一般的な FruitPicture クラスは維持したいと考えています。
私が得た最も近いものは次のとおりです。
foreach(Picture curPicture in myPictures)
{
foreach (Fruit curFruit in myFruits)
{
Covariant<Fruit> fruitType = (Covariant<Fruit>)curPicture;
if (curFruit.GetType() == fruitType.GetFruitType())
{
// what now?
}
}
}
ありがとうございます。スキート (冗談; 一種の)