将基类发送到接收派生类的方法 - c#

时间:2013-01-24 15:49:44

标签: c# inheritance polymorphism

我有一个Base类和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的派生类是什么,我想要对不同的派生类进行不同的处理。我该怎么办?

2 个答案:

答案 0 :(得分:3)

这不是多态的含义 - 即使在显式转换时,也无法传递期望专门类的基类。多态性以另一种方式工作:您可以在期望基类的任何地方传递专门的类。

你应该做的是让D.foo期待A并且你会自动被罚款。如果您在B中添加了CA没有基本实现的方法,则无论如何都需要传递B,并且无法将A强制转换为B D或{{1}}。

答案 1 :(得分:2)

只需将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).