重複の可能性:
Javaのメソッドに「新しい」修飾子はありますか?
C#では、サブクラスのメソッドをnewとして変更できます。
基本クラスから継承されたメンバーを明示的に非表示にするための新しい修飾子の1つの使用法。
Javaに同じキーワードはありますか?
重複の可能性:
Javaのメソッドに「新しい」修飾子はありますか?
C#では、サブクラスのメソッドをnewとして変更できます。
基本クラスから継承されたメンバーを明示的に非表示にするための新しい修飾子の1つの使用法。
Javaに同じキーワードはありますか?
いいえ。
C#では、newを使用して、基本クラスの非仮想関数を非表示/シャドウイングします。非仮想の関数はオーバーライドできないため、C#ではこのキーワードが必要です。
Javaでは、すべての関数はデフォルトで仮想であるため、いつでもそれらをオーバーライドでき、newなどのキーワードは必要ありません。
お役に立てれば。
C#では、ベースクラスからオーバーライドするメソッドはすべてabstract
、virtual
または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は返されません)。