【问题标题】:Why this difference of handling method ambiguity in Java & c#? [duplicate]为什么在 Java 和 c# 中处理方法歧义的这种差异? [复制]
【发布时间】:2013-06-02 09:32:08
【问题描述】:

我有两个类 A 和 B,其中 B 派生自 A。

两个类都有一个签名相同的方法。它们在Java & c#-->

中以如下方式调用

在 JAVA 的情况下:

class A
{
    public void print()
    {
        System.out.println("Inside Parent");
    }
}

class B extends A
{
    public void print()
    {
        System.out.println("Inside Child");
    }
}

class test4
{
    public static void main(String args[])
    {
        B b1=new B();
        b1.print();
        A a1=new B();
        a1.print();
    }
}

此程序生成以下输出:-

Inside Child
Inside Child

如果是 C#:

class A
{
    public void print()
    {
        System.Console.WriteLine("Inside Parent");
    }
}

class B : A
{
    public void print()
    {
        System.Console.WriteLine("Inside Child");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        B b1=new B();
        b1.print();
        A a1=new B();
        a1.print();
        System.Console.Read();
    }
}

此程序生成以下输出:-

Inside Child
Inside Parent

为什么输出不同?

【问题讨论】:

  • 我认为你的 C# 代码会在不使用关键字 new 或关键字 virtual / override 的情况下覆盖父类中的方法生成编译器警告。

标签: c# java oop


【解决方案1】:

在 Java 中,方法默认为 virtual
在 C# 中,方法默认为 not virtual

因此,为了使 C# 代码的行为与 Java 代码相同,请在基类中创建方法 virtual,在派生类中创建 override

或者,为了使 Java 代码的行为与 C# 代码相同,请在基类中创建方法 final

【讨论】:

  • 别忘了子类中的override关键字。
  • 是的..在java中,当具有相同签名的方法驻留在不同的类中时会发生“方法覆盖”,并且任何这些类的对象只能访问该方法的最新版本(即方法最后一个派生类)。因此,java 中的方法覆盖是显式发生的。在 c# 中,“方法覆盖”永远不会显式发生,除非您将基类方法设为“虚拟”,并且它的派生类方法是它的“覆盖”。
  • @Srinivas:我认为您的意思是 Java 中的方法覆盖发生隐式,即对代码或编码器没有任何特殊要求。另一方面,在 C# 中,方法覆盖显式发生,即编码人员必须显式声明他想要覆盖该方法。
  • @cremor:对。将其添加到答案中。谢谢。
【解决方案2】:

在 c# 的情况下,您需要将父方法设为虚拟,将子方法设为覆盖

class A
{
public virtual void print()
{
System.Console.WriteLine("Inside Parent");
}
}
class B : A
{
public override void print()
{
System.Console.WriteLine("Inside Child");
}
}
class Program
{
public static void Main(string[] args)
{
B b1=new B();
b1.print();
A a1=new B();
a1.print();
System.Console.Read();
}
}

【讨论】:

  • 是的.. thnks for d info..
【解决方案3】:

这一行:

  A a1=new B();

我认为在这里,在 C# 中有一个方法隐藏的示例。或许您需要显式声明该方法为已覆盖(例如在 java 中使用 @Override 注解)。

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多