5

考虑以下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");
    }
}

现在让我们尝试在 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");
        }
    }
}

Java 示例输出

我是b

我是b

C# 版本输出

我是一个

我是b

有没有办法实现 b 类,以便它打印两次“I'm b”?请注意,我不是在寻找改变 a 的方法。

4

5 回答 5

9

在 Java 中,方法默认是虚拟的。在 C# 中它们不是,您需要分别对类 a 和 b 中的方法声明使用关键字“virtual”和“override”。

于 2013-07-18T11:27:59.727 回答
5

C#版本中,您需要override在方法中使用关键字class b,并且您需要将方法class a显式地设为virtual。在 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");
    }
}
于 2013-07-18T11:28:42.830 回答
3

不,设计使然。c# 具有virtual可以在子类中覆盖的方法。这个想法是,覆盖的可能性是类合同的一部分。

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

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

于 2013-07-18T11:28:42.193 回答
1

Java 和 C# 之间的一个主要区别是,在 Java 中,方法是virtual默认的。要在 C# 中执行相同的操作,您需要将方法标记a.Infovirtual,然后使用override关键字 in b

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

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

更新

您还可以在不需要new关键字 on的情况下使用关键字 on :bvirtuala

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

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

但是,这只会在对象为 type 时产生“I'm b” b,但在将其转换回时会说“I'm a” b

b myB= new b();
myB.Info();  // This will say "I'm b"

a myA = (a)myB;
myA.Info();  // This will say "I'm a" even though it's really a b object.

查看MSDN更多信息

于 2013-07-18T11:32:17.790 回答
0

在 Java 中,我们没有为方法重载和方法覆盖使用任何关键字。在 C# 中,您必须override显式地使用 for 方法覆盖。

 public override void Info()
    {
        Console.WriteLine("I'm b");
    }
于 2013-07-18T11:29:59.910 回答