Edition)から読みはじめています。Methods"を読んで、メソッドの修飾子に「new」を使うという凄い例を初めて見たのでびっくりしました。C#からのコードの抜粋です。}}C#はメソッドが仮想(virtual)でないというのが言語仕様のポリシーなので、基底クラスでvirtual修飾子を付けないメソッドを派生クラスで再定義すると、基底クラスのメソッドが隠蔽されます(virtualとoverrideとは別)。このとき派生クラスのメソッド定義で修飾子としてnewを記述していないと、コンパイラが警告を発します(エラーではないので、気づかなかった)。なんというか、C++の複雑な仕様をC#ではそのまま引き継いでしまったような感触を受けます。C#では、newというインスタンス生成のための予約語を、ぜんぜん違う意味に転用してしまっています*1。C#の言語仕様センスっていったいなんだろうか、ちょっと驚愕です。IMsg;m.Message();と基底クラスが実装するインタフェース型にas演算子で変換した場合は、"MyClass"とIMsgを実装した基底クラスのMessage()が実行されます。C#では、MyDerivedClassでインタフェースIMsgを再実装宣言することで、上記のインタフェース型に変換したとき派生クラスのMessage()を実行されるようにできると解説していました。}ただし、基底型の変数に代入してMessage()を呼び出すと、基底型のMessage()が呼び出されます。これを、ポリモーフィズムに振舞わせるには、メソッドをvirtualにする必要があります。基底クラスのvirtualなメソッドを派生クラスでnew付きでvirtualメソッドを再定義するとか、プロパティもnewで再定義するとか、メンバー変数にもnewで定義するとか、newを使えばなんでもあり、みたいな、あまりに強力かつ困惑する機能です。*1:他にも、usingという予約語を、名前空間の導入のusing宣言と、IDisposable型オブジェクトに対してスコープから抜けるときににDispose()メソッドを呼ぶtry-finallyのシンタックスシュガー構文に使われている例があります。9はてなブログをはじめよう!torutkさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。