2016年5月29日日曜日

[C#] 抽象クラス、抽象メソッド、仮想メソッド

こんにちは。明月です。

今日は抽象クラス、抽象メソッド、仮想メソッドについて勉強します。


抽象クラス


前の投稿で親クラスから継承すると親クラスの機能を引継いでもらって機能拡張をできることを勉強しました。
でも、プロジェクトによって親クラス段階で仕様が決めておらず、派生クラス段階で仕様が決められる場合があります。
例えば、各クラスの変数の初期値は違うけれど、変数、メソッドの構造が同様で作りたい場合があります。その時に親クラスからすべて一緒の変数、メソッドを作成して派生クラスからデータを取得するように作成します。その時に親クラスから取得メソッドの実装が決めておらず、派生クラス(子クラス)で実装させ、親クラスは派生クラスの実装させたことを呼び出すことです。
すなわち、親クラスはそのメソッドを実装予約(抽象メソッド)して継承すれば実装することになっているクラスを抽象クラスといいます。



例の結果


抽象クラスと一般クラスの構造は同じですが、一般クラスは継承しなくてそのままクラスとして使えるけど抽象クラスの場合は継承しなくて使えません。



抽象メソッド


抽象メソッドの場合は必ず抽象クラス内だけ使えます。すなわち、抽象メソッドがあれば必ずクラスを抽象クラスに変換しなければならないという意味です。



上の例を見ると「AbstractClass」クラス内で抽象メソッド「getDate()」を宣言「abstract」しています。そのことを「ChildBClass」、「ChildCClass」クラスが継承して抽象メソッド「getDate()」を再実装「override」しています。そして親クラスのコンストラクタで派生メソッドを呼び出して変数「data」を設定しています。派生クラスの抽象メソッドを当該データから返却しています。



結果を見ると各クラスの変数「data」の値を出力しています。そして結果は派生メソッドで返却したデータを「data」に格納して示させています。


仮想メソッド


抽象メソッドは親クラスで実装しておらず、派生クラスに実装を引継ぎます。でも、親クラスで全然実装しないことではなく、一部実装して派生クラス(子クラス)にも引き継いで再実装(override)する場合もあると思いますね。あるいは再実装しなく、親クラスのデフォルトに実装してメソッドを使われる時もあります。
そのメソッドを仮想メソッドといいます。仮想メソッドは返却タイプ前に「virtual」とキーワードをつけます。



上の例を見ると親クラスが仮想メソッド「getDate()」を宣言しました。そして「ChildAClass」の場合は再実装しないし「ChildBClass」、「ChildCClass」の場合は既存とおりに再実装しました。



結果をみると再宣言しなかったクラス「ChildAClass」のメソッドは親クラスで実装したメソッドを呼び出され、データを取得します。「ChildBClass」、「ChildCClass」の場合は再宣言したメソッドからデータを取り出します。


仮想メソッドは再宣言しくても独立に使うことでできるので、抽象クラスではなく一般クラスでも使うことができます。


今まで抽象クラス、抽象メソッド、仮想メソッドについて勉強しました。プロジェクトをすると様々問題が発生し、どうすれば実装ができるか、またどうすれば既存の修正を最少にしてバージョンアップをするかについて悩むのが多いと思われます。結局ソフト開発はどのぐらい早めに開発できるか正確にできるか理解にしやすいかが問題ですね。そのための現在は開発構造理論で「OOP(オブジェクト指向プログラミング)」の概念が導入されました。その「OOP」の概念の始めが抽象、仮想になっています。
これから勉強すること、後でデザインパタン、リファクタリング方法のこともすべて抽象、仮想の応用になっているので確実に覚えていきましょう。

0 件のコメント