![](/img/trans.png)
[英]C#, How to pass a List of a Derived class to a method that receives a List of the Base class?
[英]Sending base class to a method which receives derived class - c#
我有一個基類和2個派生類。 我有一個基類的變量,可以容納其中一個派生類。 我想將該變量發送到接收派生類的方法。
由於不知道變量包含什么,該如何解決而無需顯式強制轉換?
碼:
Class A{
virtual public void foo1() {/.../}
}
Class B : A{
override public void foo1() {/.../}
}
Class C : A{
override public void foo1() {/.../}
}
Class D{
public foo(B argB) {/.../}
public foo(C argC) {/.../}
// in main
D varD = new D();
A varA = new B();
varD.foo(varA); //--->> Problem here need explicit casting
A varC = new C();
varD.foo(varC); //--->> Problem here need explicit casting
我不知道我要向varD.foo
發送什么派生類,並且我想對不同派生類進行不同的處理。 我能做什么?
這不是多態性的意思-即使在顯式轉換時,也不能傳遞需要專門類的基類。 多態性以另一種方式起作用:您可以在需要基類的任何地方傳遞專門的類。
您應該做的是使D.foo
期望A
然后您會自動好起來的。 如果向B
或C
添加任何在A
沒有基本實現A
,則無論如何都需要傳遞B
,並且不能將A
為B
或D
只需將foo
作為A
的抽象實例方法,並覆蓋B
和C
的實現即可。 您甚至可以保留D
類並將實際工作委托在那里,但這取決於這是否是一個好主意。
這里的代碼帶有委托給D
。 還要注意,我在所有類中都省略了foo1()
方法。
public abstract class A
{
public abstract void foo(D d);
}
public sealed class B : A
{
public override void foo(D d)
{
d.foo(this);
}
}
public sealed class C : A
{
public override void foo(D d)
{
d.foo(this);
}
}
public sealed class D
{
public void foo(B b) { [...] }
public void foo(C c) { [...] }
}
現在,您可以使用虛擬方法分派來調用正確的方法。
D d = new D();
A b = new B();
A c = new C();
b.foo(d); // Calls B.foo(D) and in turn D.foo(B).
c.foo(d); // Calls C.foo(D) and in turn D.foo(C).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.