在 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: 不检查 if
s 等的类型
通过虚拟方法调用 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
考虑以下代码:
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: 不检查 if
s 等的类型
通过虚拟方法调用 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