1. ホーム
  2. c#

[解決済み] virtual、override、new、sealed overrideの違いについて

2023-08-09 12:19:14

質問

OOPのいくつかの概念について、かなり混乱しています。 virtual , override , newsealed override . この違いを説明できる方はいらっしゃいますか?

私は、派生クラスのメソッドを使用する場合、明確には override キーワードを使用することで、ベースクラスのメソッドが派生クラスによってオーバーライドされることは明らかです。しかし newsealed override .

どのように解決するのですか?

この 仮想 キーワードはメソッド、プロパティ、インデクサまたはイベント宣言を修正し、 派生クラスでオーバーライドできるようにするために使用されます。例えば、このメソッドはこれを継承するどのクラスでもオーバーライドすることができます。 new修飾子を使用すると、ベースクラスから継承したメンバを明示的に非表示にすることができます。継承したメンバを隠すには、派生クラスで同じ名前で宣言し、new修飾子で変更します。

これはすべてポリモーフィズムに関係しています。仮想メソッドが参照先で呼ばれた場合、参照先のオブジェクトの実際の型から、どのメソッドの実装を使うかを決定します。基底クラスのメソッドが派生クラスでオーバーライドされる場合、呼び出し元のコードがオブジェクトが派生クラスのインスタンスであることを知らなくても、派生クラスのバージョンが使用されます。例えば

public class Base
{
  public virtual void SomeMethod()
  {
  }
}

public class Derived : Base
{
  public override void SomeMethod()
  {
  }
}

...

Base d = new Derived();
d.SomeMethod();

は、Base.SomeMethodをオーバーライドする場合、結局Derived.SomeMethodを呼び出すことになります。

さて、もしあなたが 新しい キーワードの代わりに をオーバーライドします。 の場合、派生クラスのメソッドは基底クラスのメソッドをオーバーライドせず、単に非表示にするだけです。その場合、以下のようなコードになります。

public class Base
{
  public virtual void SomeOtherMethod()
  {
  }
}

public class Derived : Base
{
  public new void SomeOtherMethod()
  {
  }
}

...


Base b = new Derived();
Derived d = new Derived();
b.SomeOtherMethod();
d.SomeOtherMethod();

最初に Base.SomeOtherMethod を呼び出し、次に Derived.SomeOtherMethod を呼び出すでしょう。これらは、派生メソッドがベースメソッドをオーバーライドするのではなく、事実上、同じ名前を持つ2つの全く別のメソッドです。

new または overrides のどちらも指定しない場合、結果の出力は new を指定した場合と同じですが、コンパイラの警告も表示されます (ベース クラスのメソッドを隠していることに気づいていないか、実際にそれをオーバーライドしたかったが単にキーワードを含むのを忘れていた可能性があるため)。

オーバーライドプロパティ宣言には 封印 修飾子があります。この修飾子を使用すると、派生クラスがそのプロパティをさらにオーバーライドするのを防ぐことができます。シールされたプロパティのアクセッサもシールされます。