オーバーロードとオーバーライドって似てますねー。
違いは何なのかよく聞かれます。
ロードは load ですよね?DVD見るときとか「Now loading・・・」って出るのと同じ?
だとしたら「読み込み」とかって意味かな?
loading は 「荷積み」って意味みたいです。
overloadは「荷を積みすぎる」って意味みたいです!もうまったく分からんですね(笑)
オーバーライドは「上書き」って意味かと思ってたら、「上書き」はOverwrite(オーバーライト)みたいですね。
オーバーライドは継承って意味ですね(キッパリ)
・・・継承ってなんや!!?って感じですね。
ここまでで分かるようにオーバーロードとオーバーライドは、野球と卓球くらい全然違うものです。
オーバーロードとは
通常クラス内にメソッドを定義する場合、同じ名前のメソッドは定義することができません。
しかし、オーバーロードは、引数を変えることで同じ名前のメソッドを定義することができます。
例えば、print()という出力する関数があったとします。
PHPでは、print($var) のように定義しておけば、print(123)もprint(“123”)も同じ扱いになります。
これはPHPが型の違いを柔軟に吸収してくれるからです。
PHPだけを勉強された人は何を当たり前のことを?と思うかもしれません。
でもJavaの場合は print(123)とprint(“123”) を正常に動かすためには、引数がint型のprint(int var)と引数がString型のprint(String var) を用意する必要があります。
引数の型だけでなく、引数の数も同様なことが言えます。
PHPで print($ary, $flg = false) のような関数があり、第二引数にtrueを渡すと、第1引数の配列を出力せずに文字列に変換して返す仕様だとします。
この場合、print($users) のようにユーザー情報の配列($users)を渡すと通常通り出力するが、print($users, true) と書くと、ユーザー情報の配列を文字列に変換して返してくれます。
しかし、Javaではこういう書き方はできません。
上記の場合は print(String[] users) と print(String[] users, boolean flg) の2つのメソッドを定義する必要があります。
(Javaの開発久しくしてないので間違ってたらごめんなさい)
オーバーロードは同じ名前で異なる引数を定義することなのでPHPにはオーバーライドという概念が存在しないということです。
PHPのような場合は、うっかり想定していない型でデータが渡されても正常に処理をしてしまうというのがメリットでもありデメリットでもあります。
Javaのように、引数の型や個数をしっかり定義しないと動かないようなものは、データの状態を間違えようがないので正確性が増しますが、かなり面倒です(笑)
オーバーライドとは
オーバーライドは継承した親クラスのメソッドを上書きすることです。
「上書き」はOverwriteって上で書きましたが、実際にプログラミングでオーバーライドを書くときは上書きのようなものです。
実際には上書きではなく、子クラスで同じ名前で同じ引数のメソッドを定義したら、そちらを読み込むというものです。
そもそも継承とは何か?
クラスはモノをデータと処理で定義したものです。
例えば人間には、年齢や性別など様々なデータを保持しており、食べたり手を挙げるなどの処理があります。
この人間クラスはまだ人間全般の抽象的なものを定義したものにすぎません。
では具体的なものはというと、あなたや私、お隣の田中さんなど個人のことです。
田中さんクラスは人間クラスを継承して作成します。
人間クラスに定義した食べる処理は具体的には、噛んで味わって飲み込み胃袋の満腹度メーターを上昇させるといったものがあります。
しかし田中さんは卵アレルギーだとしたら、「食べる」処理を始める前に口に含んだ食品のチェックが走ります。
そしてそれがアレルギーの卵と一致したら口の中が痒くなる処理が実行されます。
この田中さんの「独自の食べる」処理は人間クラスには定義されていないので、人間クラスの「食べる」処理をオーバーライドして田中さんクラスの「食べる」処理を定義します。
このように既に定義されたクラス(親クラス)を元に別のクラス(子クラス)を定義することを継承といい、子クラスで親クラスに定義された処理(メソッド)を上書きして新たに定義しなおすことをオーバーライドといいます。
まとめ
オーバーロードとオーバーライドは言葉は似ていますが、全然別物です。
オーバーロードは引数の異なる同じ名前のメソッドを定義することで、オーバーライドは継承した親クラスの既存の処理を上書きして子クラスに定義しなおすことをいいます。
コメントを残す