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

本文关键字:方法 派生 基类 | 更新日期: 2023-09-27 17:56:05

我有一个基类和 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哪个派生类,我希望对不同的派生类进行不同的处理。 我能做什么?

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

这不是多态性的意义所在 - 您不能传递需要专用类的基类,即使在显式强制转换时也是如此。多态性以另一种方式工作:您可以在任何需要基类的位置传递专用类。

你应该做的是让D.foo期待A,你会自动没事的。如果将任何方法添加到BC中没有A中的基本实现,则无论如何都需要传递B,并且不能将A转换为BD

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