7

我有两个类 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

为什么输出不同?

4

3 回答 3

16

在 Java 中,方法是virtual默认的。
在 C# 中,方法不是 virtual默认的。

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

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

于 2013-06-06T11:35:03.503 回答
6

在 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();
}
}
于 2013-06-06T11:34:26.753 回答
2

这一行:

  A a1=new B();

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

于 2013-06-06T11:35:39.660 回答