2

我有一个基类和 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并且我想要对不同派生类进行不同的处理。我能做些什么?

4

2 回答 2

3

这不是多态性的意义所在——即使显式强制转换,您也不能将基类传递给需要专用类的地方。多态以另一种方式工作:您可以在需要基类的任何地方传递一个专门的类。

你应该做的是让D.foo期望A,你会自动好起来的。如果您在 中添加任何方法BC没有基本实现A,则无论如何都需要传递B并且不能强制A转换为Bor D

于 2013-01-24T15:53:16.807 回答
2

只需创建foo一个抽象实例方法A并覆盖 and 中的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).
于 2013-01-24T15:53:49.520 回答