[解決済み] なぜnewキーワードが必要なのか、なぜデフォルトの動作はhideでありoverrideではないのか?
質問
私はこれを見ていました ブログ記事 を拝見し、以下のような疑問を持ちました。
-
なぜ
new
キーワードが必要なのは、ベースクラスのメソッドが隠されていることを指定するためだけなのでしょうか。つまり、なぜそれが必要なのでしょうか?もしoverride
キーワードを使用しない場合、ベース・クラス・メソッドを隠していないのでしょうか? - なぜ C# のデフォルトは非表示でオーバーライドではないのですか?設計者はなぜこのように実装したのでしょうか。
どのように解決するのですか?
良い質問ですね。もう一度説明しましょう。
<ブロッククオートなぜ、あるメソッドを別のメソッドで隠すことがまったく合法なのですか?
その質問に例で答えましょう。CLR v1からのインターフェイスがありますね。
interface IEnumerable
{
IEnumerator GetEnumerator();
}
スーパーですね。CLR v2にはジェネリックがあり、v1でジェネリックがあれば、これをジェネリックインターフェースにできたのにと思うことでしょう。でも、そうしなかった。今、私はこれと互換性のあるものを作るべきで は IEnumerable." を期待するコードとの後方互換性を失うことなくジェネリックの利点を得ることができるようにします。
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
のGetEnumeratorメソッドは何を呼び出すのでしょうか?
IEnumerable<T>
? 覚えておいてください、あなたは
欲しい
を使用すると、非汎用ベースインターフェイスの GetEnumerator が非表示になります。あなたは
は決して
を呼び出したくはないでしょう。
これだけでもメソッド隠しが正当化されます。メソッド隠蔽の正当化に関するより多くの考えについては このテーマに関する私の記事 .
<ブロッククオートなぜ"new"なしで隠すと警告が出るのでしょうか?
私たちは、あなたが何かを隠していること、そしてそれを誤って行っている可能性があることに注意を促したいと思っているからです。 派生クラスを編集しているのではなく、他の誰かが基底クラスを編集しているために、誤って何かを隠している可能性があることを忘れないでください。
なぜ "new" なしで隠すと、エラーではなく警告になるのですか?
同じ理由です。ベースクラスの新しいバージョンを拾ったばかりに、誤って何かを隠してしまうかもしれません。 これはよくあることです。FooCorpはベースクラスBを作成し、BarCorpは顧客がそのメソッドを好むので、Barメソッドを持つ派生クラスDを作成します。FooCorpはそれを見て、これはいいアイデアだ、その機能を基底クラスに追加しよう、と言う。そして、Foo.DLL の新しいバージョンを出荷します。BarCorp がその新しいバージョンを手に取ったとき、そのメソッドがベースクラスのメソッドを隠すようになったと言われたら、それは素晴らしいことでしょう。
私たちはそのような状況を 警告 ではなく エラー というのは、エラーにするということは これは脆い基底クラス問題の別の形態です。 . C# は、誰かが基底クラスを変更したときに、派生クラスを使用するコードへの影響を最小限に抑えるように慎重に設計されています。
なぜ隠蔽し、オーバーライドしないことがデフォルトなのですか?
なぜなら仮想オーバーライドは 危険 . 仮想オーバーライドは、派生クラスがベースクラスを使用するようにコンパイルされたコードの振る舞いを変更することを可能にします。 オーバーライドを行うような危険なことは、あなたが行うべきことです 意識的に であり 意図的に であって、偶然ではありません。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] 2つのリストを結合する
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】新規作成とオーバーライドの違いについて
-
[解決済み】C# - キーワードの使い方 virtual+override vs. new
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#で四捨五入する方法
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] メソッドシグネチャに新しいキーワードを追加
-
[解決済み] なぜC#はデフォルトで非仮想的なメソッドを実装しているのか?