【问题标题】:polymorphic code always has same result [duplicate]多态代码总是有相同的结果[重复]
【发布时间】:2017-10-27 07:39:13
【问题描述】:

假设我有继承自 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();
    }
 }
}

我得到了这些结果:

B1

B1

B1

我不明白这部分到底发生了什么:

c.foo(b); // prints B1

c.foo(c); // prints B1

注意:这个问题只是打印的java版本的镜像:

B1

C1

C1

如果有人能解释为什么 C# 为完全相同的 OOP 代码打印与 Java 不同的值,那就太好了!

【问题讨论】:

    标签: java c#


    【解决方案1】:

    您的编译器警告应该足以告诉您。它告诉您您的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 ");
        }
    }
    

    【讨论】:

      【解决方案2】:

      看看你的调试控制台,你会看到:

      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)

      【讨论】:

        猜你喜欢
        • 2020-09-24
        • 2019-02-13
        • 1970-01-01
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多