为什么在java&c#中处理方法歧义会有这种差异?

ykejflvf  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(179)

这个问题在这里已经有答案了

为什么java和c在面向对象方面不同(2个答案)
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();
    }
}

此程序生成以下内容output:-

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();
    }
}

此程序生成以下内容output:-

Inside Child
Inside Parent

为什么输出不同?

2o7dmzc5

2o7dmzc51#

如果是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();
}
}
hc2pp10m

hc2pp10m2#

在java中,方法是 virtual 默认情况下。
在c#中,方法不是 virtual 默认情况下。
因此,为了使c代码的行为与java代码的行为相同,请使用 virtual 在基类和 override 在派生类中。
或者,为了使java代码的行为与c代码相同,使方法 final 在基类中。

ev7lccsx

ev7lccsx3#

这条线:

A a1=new B();

我想在这里,在c#你有一个方法隐藏的例子。可能需要显式地将方法声明为重写(例如在java中使用@override注解)。

相关问题