8

重複の可能性:
Javaのメソッドに「新しい」修飾子はありますか?

C#では、サブクラスのメソッドをnewとして変更できます。

基本クラスから継承されたメンバーを明示的に非表示にするための新しい修飾子の1つの使用法。

Javaに同じキーワードはありますか?

4

2 に答える 2

4

いいえ。

C#では、newを使用して、基本クラスの非仮想関数を非表示/シャドウイングします。非仮想の関数はオーバーライドできないため、C#ではこのキーワードが必要です。

Javaでは、すべての関数はデフォルトで仮想であるため、いつでもそれらをオーバーライドでき、newなどのキーワードは必要ありません。

お役に立てれば。

于 2013-01-16T06:26:20.350 に答える
2

C#では、ベースクラスからオーバーライドするメソッドはすべてabstractvirtualまたはoverrideそれ自体である必要があります。newキーワードは、実際にはオーバーライドを行いません。それはちょっと違う働きをします:

new-keywordを使用して関数を宣言し、基本クラスの関数を非表示にすると、この実装は、まったく同じ子型のオブジェクトがある場合にのみ使用されます。例:

class TopClass
    {
        public String getHello()
        {
            return "Hello";
        }

        public virtual String getWorld()
        {
            return "World";
        }
    }

    class ChildClass : TopClass
    {
        public new String getHello()
        {
            return "Hi";
        }

        public override string getWorld()
        {
            return "Earth";
        }
    }

これにより、次のようになります。

        TopClass tc = new TopClass();
        Console.WriteLine(tc.getHello() + " " + tc.getWorld()); // Hello World

        ChildClass cc = new ChildClass();
        Console.WriteLine(cc.getHello() + " " + cc.getWorld()); // Hi Earth

        TopClass tc2 = new ChildClass();
        Console.WriteLine(tc2.getHello() + " " + tc2.getWorld()); // Hello Earth

        Console.ReadLine();

通常のオーバーライドと比較した新しいキーワードの違いを確認できます。拡張クラスが親のClassTypeにキャストされている場合、オーバーライドする関数(WorldではなくEarthを返す)は引き続き有効ですが、新しい関数は有効ではありません( Helloの代わりにHiは返されません)。

于 2013-01-16T06:51:18.483 に答える