c# - 在 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)
为时调用,但编译类型为?目前它只有在我在编译期间声明时才能正常工作。b
B
A
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
推荐阅读
- mysql - 无法通过描述获得总和
- php - curl设置服务器地址而不是代理
- python - 无法通过 PIP 将任何东西安装到虚拟环境
- python - Anaconda3\lib\subprocess.py",第 997 行,在 _execute_child 启动信息中
- ajax - axios ajax调用失败时如何访问状态码
- python - 基于单列重塑 Pandas 数据框
- java - 进度对话框在 android studio 中不起作用
- python - 为什么“去定义”在 Spyder 中不起作用?
- ruby-on-rails - 数组项的Rails部分不处理对象数据
- php - PHP / SQL 项目可以使用哪些源代码控制