让我们考虑一下B类和C类继承自B类:
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();
}
}
}
我得到了这些结果:
B1
B1
B1
我不明白为这个部分特别发生的事情:
c.foo(b); // prints B1
c.foo(c); // prints B1
注意:这个问题只是打印的java版本的镜像:
B1
C1
C1
如果有人可以解释为什么C#为完全相同的OOP代码打印不同于Java的值,那将会很棒!
答案 0 :(得分:0)
您的编译器警告应该告诉您足够的信息。它告诉您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 ");
}
}
答案 1 :(得分:-1)
查看调试控制台,您将看到:
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.
如果您想了解更多信息,请阅读Inheritance and Derived Classes (C# vs Java)