[解決済み] virtual、override、new、sealed overrideの違いについて
質問
OOPのいくつかの概念について、かなり混乱しています。
virtual
,
override
,
new
と
sealed override
. この違いを説明できる方はいらっしゃいますか?
私は、派生クラスのメソッドを使用する場合、明確には
override
キーワードを使用することで、ベースクラスのメソッドが派生クラスによってオーバーライドされることは明らかです。しかし
new
と
sealed 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 を指定した場合と同じですが、コンパイラの警告も表示されます (ベース クラスのメソッドを隠していることに気づいていないか、実際にそれをオーバーライドしたかったが単にキーワードを含むのを忘れていた可能性があるため)。
オーバーライドプロパティ宣言には 封印 修飾子があります。この修飾子を使用すると、派生クラスがそのプロパティをさらにオーバーライドするのを防ぐことができます。シールされたプロパティのアクセッサもシールされます。
関連
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] Pythonの旧スタイルのクラスと新スタイルのクラスの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み] 関数を終了するには?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。