fc2ブログ

C++/CLIをつつく21-継承1-継承禁止。もうそれ以上は・・・。

さて、他にオブジェクト指向関連の機能というと何があるかなぁ?
インドリィちゃん「前から気になっていたんだけど。」
インドリ「うぁ!出たぁ~」
インドリィちゃん「失礼ね。まぁいいわ。 それよりも、貴方が作ったサンプルプログラムのAnimalクラスに不思議な点があるんだけど。」
インドリ「どこどこ?」
インドリィちゃん「Talkメソッドってあるけど、これっておかしくない?」
インドリ「ううん。これはその種族の言葉で喋っているんだ。」
インドリィちゃん「それなら納得。じゃあ、もっと分かりやすくするべきよ。」
インドリ「相変わらずドリィちゃんは完ぺき主義だなぁ。」
インドリィちゃん「そうかしら?。読者もきっとツッコミを入れていたはずよ。」
インドリ「わかったよ。じゃあ実装するね。」
ということで毎度お馴染みAnimal抽象クラスを改良したピヨ。みんな見てね。
public ref class Animal abstract 
{
private:
	Int32 m_age;
	String^ m_name;
	String^ m_password;
	Animal(){}
public:
	property Int32 Age {
		Int32 get() { return this->m_age; }
		void set( Int32 value ) {
			if ( value > 0 ) m_age = value;
		}
	}

	property String^ Name {
		String^ get() { return this->m_name; }
	}

	property String^ Password {
        void set( String^ value ) { m_password = value; }
	}

	Animal ( String^ name, Int32 age ) {
		this->m_name = name;
		this->Age = age;
	}

	//このメソッドを修正
	virtual void Talk( ) {
		Console::WriteLine( "私は{0}。年は{1}だよ。(by {2}語)", 
			this->Name, this->Age, this->GetType()->Name); 
	}

	virtual void Move() abstract;
};

早速F5だぁ。これでボクがBird語(鳥語)を喋っていることが確認できるよ。
今回注目するべきところは

this.GetType().Name

ピヨ。前から何度かthisキーワードを使っていたけども、 それを説明していなかったので今するピヨ。 今サンプルプログラムを実行すると・・・
私はインドリ。年は29だよ。(by Bird語)
って表示される。この結果から推測できると思うけど、 thisキーワードは インスタンス自身を指し示しているんだ。 それで、GetType()メソッドは自身の型を返すメソッドだから、 Birdクラスを表すType型のが返されるからBirdと表示されるんだ。 これも多態性を表すための機能といえるピヨ。
じゃあ、今回はこれで
インドリィちゃん「ちょっと待ちなさい。貴方と私は日本語で会話しているはずよ。」
インドリ「ええっと、そうだけど。ドリィちゃんどうしたの?」
インドリィちゃん「それっておかしいわ。貴方は種類わかんないけど一応鳥よね?」
インドリ「そうだピヨ。でもボクは人間の言葉が理解できるよ。生まれつき喋れるんだ。」
インドリィちゃん「普通の鳥は人語を喋らないわ。ちょっとPC貸して。こうするべきよ。」
public ref class Animal abstract 
{
private:
	Int32 m_age;
	String^ m_name;
	String^ m_password;
	Animal(){}
public:
	property Int32 Age {
		Int32 get() { return this->m_age; }
		void set( Int32 value ) {
			if ( value > 0 ) m_age = value;
		}
	}

	//オーバーライドできるように変更
	virtual property String^ Name {
		String^ get() { return this->m_name; }
	}

	property String^ Password {
        void set( String^ value ) { m_password = value; }
	}

	Animal ( String^ name, Int32 age ) {
		this->m_name = name;
		this->Age = age;
	}

	
	virtual void Talk( ) {
		Console::WriteLine( "私は{0}。年は{1}だよ。(by {2}語)", 
			this->Name, this->Age, this->GetType()->Name); 
	}

	virtual void Move() abstract;
};

public ref class InDori sealed : Bird
{
public:
    //プロパティをオーバーライド
    virtual property String^ Name {
        String^ get() override { return "インドリ"; }
    } 

    //コンストラクタをオーバーライド
    //こうやってプロパティ値が自動的に決まるように出来る
    InDori( Int32 age ) : Bird( "インドリ", age ) {}

    virtual void Talk( ) override {
		Console::WriteLine( "私はインドリ。年は{0}だよ。(by 人語)", this->Age);
    }
};

int main(array< System::String ^> ^args)
{
    InDori^ tori = gcnew InDori( 29);
    tori->Move( );
    Console::WriteLine( "{0}参上!", tori->Name);
    tori->Talk( );
    Console::WriteLine( );

    Human^ dre = gcnew Human( "ドリィちゃん", 16 );
    dre->Move( );
    Console::WriteLine( "{0}参上!", dre->Name );
    dre->Talk( );
    Console::WriteLine( );

    return 0;
}

インドリ「へぇ~コンストラクタをそんな風にオーバーライドできるんだ。ちょっとやり過ぎな気もするけどね。あれっ? sealedって何?」
インドリィちゃん「それは、それ以上派生クラスを作れないようにするキーワードよ。
貴方みたいのがいっぱい居るわけないじゃない。
これでより特殊な鳥クラスは作れなくなったわ。 」

インドリ「ええっそりゃないよ!!!ボクだって将来結婚して子供も産まれる筈だよ。」
インドリィちゃん「それでも貴方は例外中の例外だから、子供にそんな特技が遺伝しないでBirdクラスのインスタンスになる筈よ。」
インドリ「まぁ、そうかもしれないけど。納得いかないよ!」
インドリィちゃん「別に貴方一匹ぐらい特殊な存在が居てもいいじゃないの。」
インドリ「・・・」(じーん。感動したピヨ。案外ドリィちゃんっていい奴なんだな。そういえば、まともに相手してくれたのはドリィちゃんだけだったよ。)
インドリィちゃん「なっ何、感動してんのよ。当たり前のことじゃない。もぅ終わるわよ。」
テレたドリィちゃんによって強制終了。次回へ続く・・・
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

> //コンストラクタをオーバーライド

「オーバーロード」の間違いでは?
プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター