2016年5月30日月曜日

[C#] this、base、ポリモーフィズム( overload (多型) )

こんにちは。明月です。
今日は「this」、「base」、「ポリモーフィズム( overload (多型) )」について勉強します。


前の投稿で継承について勉強したことがあります。継承のことを図で示せば下記とおりです。



上の図を考えながら「this」、「base」を勉強しましょう。


this


プログラムを作成すると多くの変数とメソッドを作ります。その度に変数名とメソッド名を命名するのは大変だと思います。それでクラスの中でメンバ変数あるいはメソッド(コンストラクタ)を同じ名で命名して同じ名の変数とメソッド(コンストラクタ)を「this」にキーワードで見分けして使います。



上の例を見るとローカルパラメタの変数名を「data」に命名し、メンバの変数名も「data」に命名しました。 そうするとローカルメソッドの内で「data」名を使うと思えばメンバ変数を使いますかローカルを使いますか?答えは一番近い変数を使います。 すなわち、「data」の変数はローカルパラメタの変数を参照していると言う意味です。改めていうと、「data」はローカルパラメタ「data」を指しているデータだし、「this.data」はメンバ変数の「data」を指しているデータです。



大体的に「this」はメンバ変数か、ローカル変数かを見分けするために使いますが、コンストラクタで他のコンストラクタを呼び出す時も使います。




上の例を見ると「Main」メソッドの内で「TestClass()」を割り当ててパラメタがないコンストラクタを呼び出します。コンストラクタの隣を見ると「this(0)」が付けて「int」のパラメタがあるコンストラクタを呼び出します。 また、パラメタが「int」型をコンストラクタは隣の「String」のパラメタがあるコンストラクタを呼び出します。
纏めて順番に並べると「TestClass(String s)」→「TestClass(int i)」→「TestClass()」の順で呼び出します。


Base


「this」はクラスの自分自身を指すと思うと「base」の場合は親クラスを指しているキーワードです。




上の例を見ると「base」、「this」の意味を確実に知ることになります。まず、コンストラクタの「base」は「this」の自分自身ではなく親クラスのコンストラクタを指していますね。
また、メソッドの中で使った「base」も親クラスのメソッドを指しています。


ポリモーフィズム(多型)


前の投稿で「OOP」の特徴について説明したことがあります。「OOP」の特徴は抽象化、継承、ポリモーフィズム(多型)、カプセルがあります。その中でこれからポリモーフィズム(多型)について勉強します。


既存に勉強したとおりならコンストラクタを作成する時にパラメタだけ変わって作成したことがあります。同様の意味でメソッド名を一致し、パラメタのタイプと個数を見分けて作成することをポリモーフィズム(多型)と言います。




上の例を見ると「Main」関数から呼ばれる関数名はすべて「TestMethod」です。でも「TestClass」の中で処理するメソッドは違います。
初めのパラメタがないメソッドを呼ばれて「 Console.WriteLine("TestMethod()");」を実行します。2つ目はパラメタが「int」型のメソッドを呼び出します。最後はパラメタ「String」型のメソッドを呼び出します。


上の形のとおりに作成したのをポリモーフィズム(多型)あるいは「overload」と言います。
プログラムのテストを受ければよく出題される問題が「Override」と「Overload」の差です。


  • overrideは仮想メソッドあるいは抽象メソッドから再実装することです。
  • overloadは多型(ポリモーフィズム)のでパラメタタイプ別で同じメソッド名を定義することです。

「overload」と「override」は見分けが大変なので意味を確実に覚えて行きましょう。

0 件のコメント