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