Java 多态代码总是有相同的结果 让我考虑我从B类继承了B类和C类: namespace ConsoleApp1 { class B { public void foo(B obj) { Console.WriteLine("B1 "); } public void foo(C obj) { Console.WriteLine("B1 "); } } class C : B { public void foo(B obj) { Console.WriteLine("C1 "); } public void foo(C obj) { Console.WriteLine("C1 "); } } public class Program { static void Main(string[] args) { B c = new C(); B b = new B(); b.foo(c); c.foo(b); c.foo(c); Console.ReadLine(); } } }
我得到了这些结果:Java 多态代码总是有相同的结果 让我考虑我从B类继承了B类和C类: namespace ConsoleApp1 { class B { public void foo(B obj) { Console.WriteLine("B1 "); } public void foo(C obj) { Console.WriteLine("B1 "); } } class C : B { public void foo(B obj) { Console.WriteLine("C1 "); } public void foo(C obj) { Console.WriteLine("C1 "); } } public class Program { static void Main(string[] args) { B c = new C(); B b = new B(); b.foo(c); c.foo(b); c.foo(c); Console.ReadLine(); } } },java,c#,Java,C#,我得到了这些结果: B1 B1 B1 我不明白到底发生了什么,特别是在这个角色上: c.foo(b); // prints B1 c.foo(c); // prints B1 注意:这个问题只是java版本的镜像,它打印: B1 C1 C1 如果有人能解释为什么C#为完全相同的OOP代码打印不同于Java的值,那就太好了 编译器警告应该足以说明问题。它告诉您您的C.foo隐藏了方法B.foo,因为您没有使用继承。而不是仅仅覆盖以前的方法声明 您应该在C#中使用virtual和ov
B1
B1
B1
我不明白到底发生了什么,特别是在这个角色上:
c.foo(b); // prints B1
c.foo(c); // prints B1
注意:这个问题只是java版本的镜像,它打印:
B1
C1
C1
如果有人能解释为什么C#为完全相同的OOP代码打印不同于Java的值,那就太好了 编译器警告应该足以说明问题。它告诉您您的
C.foo
隐藏了方法B.foo
,因为您没有使用继承。而不是仅仅覆盖以前的方法声明
您应该在C#中使用virtual
和override
来声明方法继承
class B
{
public virtual void foo(B obj)
{
Console.WriteLine("B1 ");
}
public virtual void foo(C obj)
{
Console.WriteLine("B1 ");
}
}
class C : B
{
public override void foo(B obj)
{
Console.WriteLine("C1 ");
}
public override void foo(C obj)
{
Console.WriteLine("C1 ");
}
}
查看调试控制台,您将看到:
warning CS0108: 'C.foo(B)' hides inherited member 'B.foo(B)'. Use the new keyword if hiding was intended.
warning CS0108: 'C.foo(C)' hides inherited member 'B.foo(C)'. Use the new keyword if hiding was intended.
如果你想知道更多,请阅读