我觉得界面(相反?)方差是答案,但找不到正确的解决方案。
让我们有这些类:
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(); }
我的情况是:
我有一组已经初始化的香蕉和苹果,比如这两个(但我可以使用不同的):
Fruit[] myFruits = new Fruit[2] { new Banana(), new Apple() };
我有一组图片,比如这两个:
Picture[] myPictures = new Picture[2] { new FruitPicture<Banana>(), new FruitPicture<Apple>(), };
现在,我试图做一件非常简单的事情,但以一种通用的方式,这意味着我想避免任何开关/ifs,每次找到新水果时我都必须更改代码并且新的 FruitPicture 可能会出现在集合中 =>我想.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?
}
}
}
谢谢先生。飞碟(开玩笑;有点)