オーバーロード。
今日の学校ー。
「Javaならではっ」な部分(?)を
自信度23%程の、弱弱しい信用性で書いておりますが(^_^;
今回は「オーバーロード」でございます。
はて、オーバーロード?
同じ名前の関数を作っても、
引き数が、ちょいと違えば違う振る舞いをしてくださるそうで。
そういう関数を定義する事、だそうです。
引き数が違う…とは、引き数の数もそうだけど
引き数のデータ型が違うだけでも、勿論OK。
で、この「引き数の数やデータ型」を
シグニチャと呼ぶそうです。へぇー。
public class Test() {
public static void main( String[] args ) {
showText( "あいうえお" );
showText( 12345 );
}
static void showText( String text ) {
System.out.println( "引き数はStringの" + text + "なんですよ" );
}
static void showText( int num ) {
System.out.println( "引き数はintの" + num + "なんですね" );
}
}
上記の例だと、showText という関数が2つあるんだけど
それぞれの引き数のデータ型が違うので、
エラーになったり、どちらかが上書きされたり…という事にならず
どっちも使えるようになる、と。
で、main の中で呼ぶ際に、showText の引き数に
String(あいうえお)を与えてやると、前者が実行され、
int(12345)を与えてやると、後者が実行される、と。
ははぁー、便利ぃー♪
そんでもって。
PHPでも、何やらこの言葉は耳にするようなんですが。
果たしてこれを、同じオーバーロードと呼んでいいのか?
と思うくらいなのであります。
→参照:Do You PHP?
って訳で、試しにPHPで書いてみたけど
案の定、エラーが出てしまうのでした。
Fatal error: Cannot redeclare 関数名() in ...
一方、perlも、そんなの見た事ないような…と思いつつも
「Effective Perl」を見てみたら、P.209には…
Perlでは、メソッドは非常にシンプルにオーバーロードできる。
…と書いてある。へぇー。
しかし、実際にperlで書いてみると、
エラーは出ないけど、構文チェックすると案の定、
Subroutine 関数名 redefined at ...
…と表示されて、結局、シグニチャに応じてうんぬん…という
概念に当てはまらない。
そういう訳で、どちらも
「オーバーロードじゃなくて、オーバーライドなんじゃないの?」
てな事らしいです???…ようわからんけど(笑)
あ、そうそう。
ところで、Java習ってると、
関数じゃなくて、メソッドってやたら言ってるんですけど
関数って呼んじゃいけないのかしら???