http://blogs.wankuma.com/rti/archive/2007/08/28/92305.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12
http://blogs.wankuma.com/rti/archive/2007/08/27/92095.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門11
http://blogs.wankuma.com/rti/archive/2007/08/20/91083.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門10
http://blogs.wankuma.com/rti/archive/2007/08/14/90238.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門9
http://blogs.wankuma.com/rti/archive/2007/08/10/89801.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門8
http://blogs.wankuma.com/rti/archive/2007/08/08/89397.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門7
http://blogs.wankuma.com/rti/archive/2007/08/07/89226.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6
http://blogs.wankuma.com/rti/archive/2007/08/02/88399.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門5
http://blogs.wankuma.com/rti/archive/2007/07/31/87955.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門4
http://blogs.wankuma.com/rti/archive/2007/07/30/87742.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門3
http://blogs.wankuma.com/rti/archive/2007/07/26/87105.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門2
http://blogs.wankuma.com/rti/archive/2007/07/25/86988.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門1
の続きです。
どこからフォローすれば良いのかわからないので、先頭から順に行ってます。
今回は
抽象クラス
というテーマです。
毎度おなじみのR・田中一郎クラスですが、これらのメンバは、同じわんくま同盟の方のクラスを作る時にも流用できます。
ですから、共通して使うことのできるクラスを作って、これを継承すれば何かと便利ですね。
しかし、同じ実装で良いメンバと、人によって実装が異なるメンバがあります。
こういった場合、メンバのみ定義して、実装は継承したクラスに任せることができます。
以下の C# のコードを見て下さい。
abstract class わんくま同盟
{
abstract public string 会員番号 { get; } // 抽象メソッドには定義は要らない
abstract public string 名前 { get; }
abstract public string 年齢 { get; }
abstract public string 職業 { get; }
public virtual void 自己紹介(){
Console.Writeline(
"オブジェクト指向ファンの皆さん、こんにちは。" +
"わんくま会員番号" + this.会員番号 + "番の" + this.名前 + "です。" +
"年齢は、" + this.年齢 + "才。職業は、" + this.職業 "です。" +
"今日は、オブジェクト指向ファンの皆さんを前にして、" +
this.印象 + "な僕が、オブジェクト指向について語るということで、" +
"些かガクブルな状態ではありますが、早速はじめたいと思います。"
);
}
上記の abstract というキーワードが付加されたメンバーは、メンバ名の定義のみが表記されていて実装はありません。
従って、どのような振る舞いをさせるのかを抽象化していることになります。
このように抽象的なメンバには、abstract キーワードを付加します。
抽象化したメンバを含むクラスは、当然、そのクラスだけでオブジェクトを生成できません。
何故なら、実装の無いメンバにアクセスすることなんてできませんし、仮にそれができたとしても実行時にエラーを発生させるくらいなら、コンパイル時に解決したい問題になります。
つまり、抽象化したメンバを含むクラスは、抽象クラスでなければなりません。
そこで クラスにも abstract キーワードを付加します。
abstract キーワードのついたクラスは、オブジェクトを生成できません。
抽象クラスは、以下のように継承されるためのクラスです。
class R.田中一郎 : わんくま同盟
{
public override string 会員番号 { get { return "34"; }}
public override string 名前 { get { return "R・田中一郎"; }}
public override string 年齢 { get { return "18"; }}
public override string 職業 { get { return "IT関係"; }}
public override string 印象 { get { return "素敵だし爽やか"; }}
}
このようにしておくと、次のように、わんくま同盟型を使うことができます。
this.名前と印象を表示(new R.田中一郎());
this.名前と印象を表示(new ぽぴ王子());
private void 名前と印象を表示(わんくま同盟 w) {
Console.Writeline(w.名前 + ":" + w.印象);
}