new修飾子
new
修飾子を使うと、ベースクラスから継承したvirtual
でないメソッドを再定義できる。
(new
修飾子を使わなくても隠蔽はできるが、コンパイル時に警告が出る)
しかし、継承関係にあるクラスのもつ同名のメソッドがコンテキストによって異なる振る舞いをすると、クラスの利用者からは予測がしづらい。
new
修飾子の使用は原則として避け、異なる振る舞いには異なる名前をつけるべきである。
また、new
修飾子による再定義を避けるべき、というのは、ベースクラス定義時に何でもvirtual
で宣言しろということではない。
ポリモーフィックな振る舞いをすべきプロパティ・メソッドにのみvirtual
を使用し、それ以外はオーバーライドを許さないようにすべきである。
なお、new
修飾子を使ってもよい場面が1つだけある。
それは、ベースクラスに、サブクラスで定義していたのと同じ名前のメソッドが追加された場合である。
この場合、原則としては自分の定義したメソッドの名前を変更すべきだが、全てを変更するコストが高くつきすぎる場合には、自分のメソッドにnew
演算子を追加して、名前を変更せずにメソッドを呼び出せるようにすることができる。