Effective C# 3rd 読書メモ 10 new修飾子はベースクラスが変更された場合にのみ使用する

new修飾子

new修飾子を使うと、ベースクラスから継承したvirtualでないメソッドを再定義できる。
new修飾子を使わなくても隠蔽はできるが、コンパイル時に警告が出る)
しかし、継承関係にあるクラスのもつ同名のメソッドがコンテキストによって異なる振る舞いをすると、クラスの利用者からは予測がしづらい。
new修飾子の使用は原則として避け、異なる振る舞いには異なる名前をつけるべきである。

また、new修飾子による再定義を避けるべき、というのは、ベースクラス定義時に何でもvirtualで宣言しろということではない。
ポリモーフィックな振る舞いをすべきプロパティ・メソッドにのみvirtualを使用し、それ以外はオーバーライドを許さないようにすべきである。

なお、new修飾子を使ってもよい場面が1つだけある。
それは、ベースクラスに、サブクラスで定義していたのと同じ名前のメソッドが追加された場合である。
この場合、原則としては自分の定義したメソッドの名前を変更すべきだが、全てを変更するコストが高くつきすぎる場合には、自分のメソッドにnew演算子を追加して、名前を変更せずにメソッドを呼び出せるようにすることができる。

参考:new 修飾子 (C# リファレンス)

コメントを残す