如何在Java中实现与C#相同的覆盖体验?

Dor*_*rus 5 c# java

考虑以下Java代码:

public class overriding {
    public static void main(String[] args) {
        b b = new b();
        a a = (a)b;
        a.Info();
        b.Info();
    }
}

class a {
    void Info() {
        System.out.println("I'm a");
    }
}

class b extends a {
    void Info() {
        System.out.println("I'm b");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试在C#中做同样的事情

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            b b = new b();
            a a = (a)b;
            a.Info();
            b.Info();
            Console.ReadLine();
        }
    }

    class a
    {
        public void Info()
        {
            Console.WriteLine("I'm a");
        }
    }

    class b : a
    {
        public void Info()
        {
            Console.WriteLine("I'm b");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Java示例输出

我是b

我是b

C#版本输出

我是一个

我是b

有没有办法实现类b,以便它打印"我是b"两次?请注意我不是在想办法改变一个.

Eyv*_*ind 9

在Java中,默认情况下方法是虚拟的.在C#中它们不是,你需要分别使用关键字"virtual"和"override"来表示类a和b中的方法声明.


Roh*_*ain 5

C#版本中,您需要overrideclass b方法中使用关键字,并且还需要在class a虚拟中明确地使用该方法.在Java中,默认情况下方法是虚拟的.事实并非如此C#.你需要明确告诉:

class a
{
    public virtual void Info()
    {
        Console.WriteLine("I'm a");
    }
}

class b : a
{
    public override void Info()
    {
        Console.WriteLine("I'm b");
    }
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*mas 3

不,设计使然。c# 有virtual您可以在子类中重写的方法。这个想法是,覆盖的可能性是类契约的一部分。

在 Java 模型中,子类可能会通过将新方法命名为与基方法相同但不提供正确的行为来破坏行为。

在 C# 中,您需要明确这一点。