メソッドおよびコンストラクタのオーバーロード | のんびりした人の日記

のんびりした人の日記

仕事の愚痴とアニメ関連のことを書いていきます。

今回のネタは「オーバーロード」です。
Javaにも出てきたあれです。けど、僕は結構用語には無頓着だったので正確には覚えていないのです。
なので、今回を機に用語についてもちゃんと学習しておこうと思います。

オーバーロードというとメソッドのオーバーロードがまず頭に浮かびますね(僕は特にそうです)。
けど、オーバーロードというのはメソッドだけでなくコンストラクタにも使われるものなのです。Javaとかやっているひとにとっては「んなもんあたりまえじゃ」という感じでしょうね。



まずは用語から。
オーバーロードとは、同じ名前のメソッドまたはコンストラクタでも、仮引数の宣言が異なる場合には同じクラスに同じ名前の複数のメソッドまたはコンストラクタを持つことができることをいいます。
これは独習C#の言い回しをアレンジしてみました。まぁ、ただ合わせただけなのですがね。
んで、とりあえずポイント。まずはメソッドのオーバーロードについて。
①メソッド名は同じだけど仮引数の個数や型が1つでも異なる
②戻り値については同じでも異なっていてもどちらでもいい
かなり大雑把に言うと「メソッド名が同じもので、しかし仮引数の型とか数がまったく同じメソッドはだめ」というところですかね。
まぁ、仮引数の型とか数がまったく同じだとそのメソッドを宣言する意味というのはあまりない気がしますけどね。
そして、あとは実際にプログラムを実行したときには、仮引数に何が指定されているかによってコンパイラが自動で該当するメソッドを選択してくれるということです。
もし該当するメソッドがないときには、暗黙的に型変換が行われてまたコンパイラさんが該当するメソッドを選択してくださいます。
コンパイラさんはかなり優秀な方なのですね。恐れ入ります。
そんで、前にやったrefとoutについても関係していて、メソッド名が同じで仮引数の型および数が一緒のメソッドで、片方にrefでもう一方にoutが付いてるメソッドはだめです。
refとoutの違いだけではオーバーロードはできないようですね。これは気をつけておかないといけませんね。
メソッドをオーバーロードできるようにした理由というのが、「同じ処理についても仮引数について異なる部分があったときには、別々のメソッド名を付けてメソッドを定義しないといけない」ということがあったかららしいです。
別々のメソッド名を付けた場合には、どのメソッドがどんな動作をするかをより覚えないといけないですもんね。同じ処理をするのに名前を覚えないといけないとか面倒すぎますよね。
そんなわけで、「仮引数が違っても処理が同じならメソッド名も同じにしたほうがよくね」ということでこのような機能が追加されたわけらしいです。
けど、これなら結構作業的には楽にはなる感じですよね。



お次。コンストラクタのオーバーロード。
これも要点はメソッドの①と同じです。
・コンストラクタ名は同じ(当たり前)だけど仮引数の個数や型が1つでも異なる
コンストラクタをオーバーロードする一般的な理由というのは「あるオブジェクトのインスタンスを使ってあるオブジェクトのほかのインスタンスを初期化できるようにすること」らしいです。
これは初めて知りました。よくほかの入門書とかには「引数にそのクラスのオブジェクトも指定できる」とか何とか書いてあったけど、「そんなんして意味あるんかな」とか思っていましたから。実際には意味があるのですね。
そして、このような方法は効率的で結構使われているとか。なんか、初期化用のインスタンスを最初に生成しておいて、初期化したいときにはそれを引数にぶち込む感じなのかな。このインスタンスは初期化以外には使わないとか。
そんで、これもよく出てくるthisキーワード。
これはあるコンストラクタから別のコンストラクタを呼び出すときに使われる省略用のもの、といううろ覚えの知識があるのですが(あっていますかね?)。
けどなんか・・・・・Javaとは記述の仕方が違う!!なんかコンストラクタと仮引数の()があってそのあとに「:this(実引数)」みたいな感じになってる!これは、NA☆N☆ZO☆YA!!
thisのあとの()には仮引数かと思いきや実引数だし。
けど、考え方はメソッドのオーバーライドと同じですね。それと同様に考えていけばいい感じです。
つまり、this(実引数たち)とするとほかのコンストラクタで実引数たちの型および個数に適合するコンストラクタを今回もコンパイラ(かな?)が探してくれて、それをまず呼び出してくれるという感じですね。そんで、this(実引数たち)のコンストラクタの処理の後に本体のほうのコンストラクタの処理を行ってくれるという感じでしょうかね。
・・・・・Javaはこんなことできたかなぁ。っまいっかw
thisを使用してほかのコンストラクタを呼び出すメリットとしては
①コードの重複を避けること
②暗黙のデフォルト引数をもつコンストラクタを作成できること
です。デフォルト引数がわからん人は独習C#を買ってください。なんせこの日記は自分の勉強用なのですからw



さて、今日はこんぐらいにしておきますか。

なんか、著作権についてうるさく書いているので、少しそれ対策みたいなことをしておきますかね。


引用および参考:独習C# ハーバード・シルト著