Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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# - Fatal编程技术网

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.
如果你想知道更多,请阅读