Skip to main content

メソッドオーバーライドとは何ですか?

メソッドオーバーライドは、継承階層内のオブジェクト指向プログラミングで使用され、スーパークラスで定義されたメソッドがサブクラスで再定義されると発生します。通常、サブクラス方式は、スーパークラスメソッドとは異なることを行うか、スーパークラスの機能を拡張しますが、これは当てはまる必要はありません。メソッドオーバーライドは、再定義されたメソッドの内容に関係なく、スーパークラスメソッドがサブクラスで再定義されるたびに発生します。再定義されたメソッドシグネチャはまったく同じでなければなりません。たとえば、クラスAにはdosomethingと呼ばれるメソッドが含まれている場合があり、この方法では入力パラメーターは必要ありません。さらに、クラスBとCは、クラスAのサブクラスである場合があります。クラスBには、入力パラメーターを服用しないDoSomethingと呼ばれるメソッドが含まれている場合があり、クラスCには入力パラメーターとして数字を取る方法が含まれている場合があります。この例では、クラスBのみがスーパークラスであるクラスAと同じメソッドシグネチャを持っているため、クラスBのオーバーライドを上書きする方法を示します。。C++の仮想継承は、オーバーライドのメソッドのもう1つの例です。スーパークラスの仮想メソッドは実装されるかもしれませんが、それらのサブクラス定義は、オーバーライドのインスタンスです。サブクラスでメソッドがオーバーライドされている場合、スーパークラスのメソッドは、明示的に呼び出されない限り呼び出されません。オーバーライドされた方法を呼び出すこの特定の方法は、スーパークラスの実装を隠すとよく言われます。JavaとC ++の両方で、メソッドシグネチャに特定のキーワードを適用して、サブクラスでメソッドがオーバーライドされないようにします。これを行うには、Javaは最終的なキーワードを使用し、C ++はconstキーワードを使用します。特定の関数が継承ツリー全体で常に変更されていない場合、オーバーライドを無効にすることは有益です。オーバーライドから最も利益を得る傾向があるケースは、サブクラスがまったく新しい方法を作成せずにスーパークラスの方法に機能を追加することを目的としている場合です。1つの特定のタイプのオブジェクトに対してメソッドを完全にやり直す必要がある異常な場合も、この手法の恩恵を受ける可能性があります。メソッドがオーバーライドされたときはいつでも、プログラマーがスーパークラスとサブクラスの両方のメソッドの両方に適切にコメントすることが重要です。理想的には、これらのコメントは、メソッドの各バリアントが何をするか、そしてそれらがどのように、そしてなぜ違うのかを明確にする必要があります。