我有對象的繼承結構,有點像以下:多態性與解釋
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版卡住了。 –