我有对象的继承结构,有点像以下:多态性与解释
public class A { }
public class B : A { }
public class C : B { }
理想情况下,我想能够B
或C
传递的A
List
,以这样一个方法:
private void Method(List<A> foos) { /* Method Implementation */ }
B toBee = new B();
B notToBee = new B();
List<B> hive = new List<B> { toBee, notToBee };
// Call Method() with a inherited type. This throws a COMPILER ERROR
// because although B is an A, a List<B> is NOT a List<A>.
Method(hive);
我想想出一种方法来获得这个相同的功能,尽可能少的代码重复。
我能想出是创建包装方法,其接受通过传递列出了不同类型的列表,然后循环来调用相同的方法最好的;最后用多态性我的优势:
private void Method(List<A> foos) { foreach (var foo in foos) Bar(foo); }
private void Method(List<B> foos) { foreach (var foo in foos) Bar(foo); }
private void Method(List<C> foos) { foreach (var foo in foos) Bar(foo); }
// An A, B or C object can be passed to this method thanks to polymorphism
private void Bar(A ayy) { /* Method Implementation */ }
巴士,你可以看到,我已经从字面上复制并粘贴该方法三次,只改变包含在通用列表的类型。我开始相信,只要你开始复制和粘贴代码,有一种更好的方式来做到这一点......但我似乎无法提出一个。
我怎样才能做到无不良复制和粘贴这样的壮举?
这是一个更好的解决方案! – BartoszKP
@BartoszKP它取决于实施中的内容,如果列表需要修改,那么你的解决方案更好:-) –
谢谢你的信息丰富的答案卢卡斯。不幸的是,它看起来像C#在.NET 4.0之前不支持泛型接口中的协变性,而我使用3.5版卡住了。 –