日々常々

ふつうのプログラマがあたりまえにしたいこと。

オーバーライドとオーバーロード

オーバー○○ドと被っている文字が多いからなのか、曖昧だったり、入れ替わったり、混同されたりするオーバーライドとオーバーロード。こうして並べて書いたりすると、また誤解の原因になるのかもしれません。
個人で勘違いしてる程度ならまだ苦笑で済ませたり、その場で訂正したり、脳内でフィルタかけてみたりで済ませればいいのでしょうが、一部の解説サイトや、酷いものでは出版されている解説書にすらそういう記述が見られます。そしてそれを読んだ人が、正しい知識として認識してしまうことがあり、その人からまた広まるなんてことも実際にあります。

オーバーライドとオーバーロードで同じ点は、その対象となるメソッドの名前が同じであるということのみ。のはず。実際のところ、記述も、使われる目的も、結果として動作も全く違うものです。基本中の基本といっても差し支えないと思うのですが、あやふやなで中途半端な知識のままで使う、もしくは使うことを避けたりしている結果に生まれたコードにぶち当たることがしばしば。では自分はどういう覚え方をしているか。使い方とかは別の機会に書くとして、区別というか文言の認識からの使い方を書いてみます。ちなみに私の英語の成績は壊滅的でした。

オーバーライドは、「上に乗せる」から「うわかぶせ」と脳内訳しています。元々あるものを被せるものという認識です。というわけで、親クラスにあるメソッドを再定義したりするものです。オーバーライドされたメソッドは1つのオーバーライドされるメソッドに対して1つのみ、そのクラス内につくられます。どうあがいても、1つのオーバーライド元メソッドに対して複数メソッドを1クラスに記述することは出来ません。コンパイルエラーになりますし。

オーバーロードは、「重ねて読み込む」から「複数定義する」の脳内訳になっています。複数定義されるのは同じ名前のメソッドです。同名のメソッドオーバーロードの関係にあるというだけで、特定のメソッドをさしてオーバーロードされたメソッドオーバーロードしたメソッドといった呼び方をするには抵抗があります。複数の同名メソッド共存するのがオーバーロードです。

似た文言のうえ、ぱっと見た目のコードが似ているからといって、そのまま認識まで混同してしまうくらいなら、脳内訳でもして別の言葉と結び付けておくのがいいのではないでしょうかね。