多态代码总是有相同的结果

时间:2017-10-27 07:39:14

标签: java c#

让我们考虑一下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的值,那将会很棒!

2 个答案:

答案 0 :(得分:0)

您的编译器警告应该告诉您足够的信息。它告诉您C.foo隐藏了方法B.foo,因为您没有使用继承。而不是你只是覆盖以前的方法声明。

您应该在C#中使用virtualoverride来声明方法继承。

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)