簡體   English   中英

將基類發送到接收派生類的方法-C#

[英]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然后您會自動好起來的。 如果向BC添加任何在A沒有基本實現A ,則無論如何都需要傳遞B ,並且不能將ABD

只需將foo作為A的抽象實例方法,並覆蓋BC的實現即可。 您甚至可以保留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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM