在 C# 中使用运行时类型重载

overloading with runtime type in c#

考虑以下代码:

public class A
{
    public A(){}
}

public class B:A
{
    public B(){}
}

public class C
{
    public C(){}
    
    public void fun(A a)
    {
        Console.WriteLine("that was A");
    }
    
    public void fun(B b)
    {
        Console.WriteLine("that was B");
    }
}

public class Program
{
    public static void Main()
    {
        A a = new A(), b = new B();
        C c = new C();
        c.fun(a);
        c.fun(b);
    }
}

在当前的形式中,它说 "that was A" 两次。如何修复classC,以便在b的运行时类型为B但编译类型为A时调用fun(B b)?目前只有当我在编译期间将 b 声明为 B 时它才能正常工作。

@Edit: 不检查 ifs 等的类型

通过虚拟方法调用 fun

public class A
{
    public virtual void fun(C c) 
    {
        c.fun(this);
    }
}

public class B:A
{
    public override void fun(C c) 
    {
        c.fun(this);
    }
}

public class C
{
    public void fun(A a)
    {
        Console.WriteLine("that was A");
    }

    public void fun(B b)
    {
        Console.WriteLine("that was B");
    }
}

public class Program
{
    public static void Main()
    {
        A a = new A(), b = new B();
        C c = new C();
        a.fun(c);
        b.fun(c);
    }
}

输出:

that was A
that was B

See example on Fiddle