0

インターフェイスの (反?) 分散が答えのように感じますが、適切な解決策が見つかりません。

これらのクラスを用意しましょう:

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?
        }
    }
}

ありがとうございます。スキート (冗談; 一種の)

4

1 に答える 1