首页 > 解决方案 > 在 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"了两次。如何修复类C,以便在运行时类型fun(B b)为时调用,但编译类型为?目前它只有在我在编译期间声明时才能正常工作。bBAbB

@Edit:不使用ifs 等检查类型。

标签: c#inheritancetypesruntimeoverloading

解决方案


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

请参阅小提琴上的示例


推荐阅读