Back to page

− Links

 Print 

Diff of Articles​/D言語入門講座​/第15章 - オブジェクト指向 :: D言語友の会

Diff of wiki:Articles/D言語入門講座/第15章 - オブジェクト指向

  
Cur: 2012-05-14 (Mon) 23:28:46 SHOO[3] source[4]
With "pcomment" plugin. (Only touched)
Line 1: Line 1:
 +TITLE:オブジェクト指向
 +#navi
 +* #01 オブジェクト指向とは [#cdeb4cfc]
 +** 今回は… [#v8c9d3b3]
 +オブジェクト指向について少しだけ触れていきます。~
 +まず、オブジェクト指向とはどういうものなのかを簡単に説明すると、~
 +「構造体をもっと使いやすくしたもの」~
 +といった感じです。~
 +C言語でかなり無理矢理にオブジェクト指向的なプログラムを組もうと考えた場合、まさに構造体をあれこれすることになります。
 +
 +さて、前回までに構造体とポインタを使って関数に渡す云々という話をしましたが、これがオブジェクト指向の入り口になります。~
 +たとえば、次のようなプログラムを組む時のことを考えてみます。
 +
 +- 人がいます(学生とします)。(「人」型の構造体の定義)
 +- 一日の行動をプログラムで表します。(メインの流れ)
 +- 行動は以下のとおりです
 +-- 起床(WakeUp)
 +-- 食事(Eat)
 +-- 移動(Move)
 +-- 勉強(Study)
 +-- 就寝(Sleep)
 +- 行動のたびに、行動開始時に現在「人」がいる場所を表示します
 +- 起床時「人」は自室にいます。
 +
 +このような場合、主人公となる「人」が一人いて、その人が行動すると考えることができます。~
 +ところで、その「人」は名前があったりしますね。~
 +たとえばここでは仮に「前原圭一」としましょう。~
 +「人」型の変数、「前原圭一」です。
 +
 +「人」という、種族や集団のような、種類、型を表すものの呼び方を、オブジェクト指向ではクラスと言います。~
 +また、「前原圭一」のような、「人」の集団に属する個に対する呼び方を、オブジェクト志向ではインスタンスと言います。~
 +そんでもって、「人」や「前原圭一」のようなクラスやインスタンスをひっくるめて、オブジェクトと言います。~
 +…ということで以降の表現を統一しますね。(この辺は表記にブレが多いのです。オブジェクト=インスタンスだと言ったり、オブジェクト=クラスだといったり、オブジェクト⊃[クラス,インスタンス]だといったり…ある程度はオブジェクト=インスタンスという傾向が強いようですが…)~
 +この辺の詳しい解説はC++やJavaなどの解説ページや、Wikipediaなどで情報が収集できます。独習してみましょう。
 +
 +さて、プログラムのほうですが…~
 +「人」型は、「名前」をメンバに持っていて、さらに、現在位置を知っていなければならないので、「場所」も保存しておかなければなりません。~
 +行動については、~
 +「起床」は、誰が起きるかを指定するため、「人」を引数にします。~
 +「食事」は、誰が何を食べるかを指定するため、「人」と、食べ物の名前を引数にします。~
 +「移動」は、誰がどこに行くかを指定するため、「人」と、場所の名前を引数にします。~
 +「勉強」は、誰が勉強するのかを指定するため、「人」を引数にします。~
 +「就寝」は、誰が寝るのかを指定するため、「人」を引数にします。~
 +さて、この条件でプログラムを書いてみるので、サンプルコードをご覧ください。~
 +(これがC言語でやるようなオブジェクト指向プログラミングのやり方です。)
 +
 +** 今回のミソ [#p0c630e9]
 +- オブジェクトの入り口は構造体をポインタで関数に渡すこと
 +- 種類や型を示す呼び方をオブジェクト志向では「クラス」という
 +- 種類や型に属する個を示す呼び方をオブジェクト志向では「インスタンス」という
 +
 +
 +** サンプルコード [#h329e00b]
 +#code(d,sample1501p.d);
 +#region(Tango用はこちら){{
 +#code(d,sample1501t.d);
 +}}
 +
 +
 +** 実行結果 [#mc5899dd]
 +#code(console){{{
 +$ dmd -run sample1501p.d
 +前原圭一は現在自室にいます。
 +前原圭一は自室のベッドで目を覚ました。
 +
 +前原圭一は現在自室のベッドにいます。
 +前原圭一は自室のベッドから食卓へ移動した。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は朝食を食べた。少し元気になった。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は食卓から学校へ移動した。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一はお昼の弁当を食べた。少し元気になった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は学校から家へ移動した。
 +
 +前原圭一は現在家にいます。
 +前原圭一は家から食卓へ移動した。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は夕食を食べた。少し元気になった。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は食卓から自室へ移動した。
 +
 +前原圭一は現在自室にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在自室にいます。
 +前原圭一は自室のベッドで眠りに就いた。
 +}}}
 +
 +
 +** まとめ [#tf9ff4c1]
 +さて、コードをみるとわかると思いますが、WakeUpにしろEatにしろ、関数の第一引数に常にParson*という「人」型を示すポインタを引数に取っています。~
 +関数を定義するときも、関数を使用するときも、面倒ですね。~
 +………まぁ、面倒と思うかどうかは人それぞれだとは思いますが…~
 +少なくとも、オブジェクト指向というのは、このような使い方をする場合が非常に多いので、D言語にはこれを簡単にする方法が備わっています。~
 +次回はそんな話です。
 +
 +
 +* #02 メンバ関数 [#t2b67608]
 +** 今回は… [#d48b2c8e]
 +メンバ関数についてお話します。~
 +メンバ関数とは、構造体などが持つ、メンバの、関数のことです。~
 +など、というのは、構造体だけでなく、のちに解説するクラス(structに対するclassというもの)や共有体(union)もそうだからです。
 +
 +さて、前回ではいちいち
 +#code(d,nomenu,nonumber,nooutline){{{
 +WakeUp( &keiichi );
 +}}}
 +などとして、構造体のポインタを関数に引き渡してやりました。~
 +メンバ関数では、
 +#code(d,nomenu,nonumber,nooutline){{{
 +keiichi.WakeUp();
 +}}}
 +のように、"."(ピリオド)を使ってアクセスします。~
 +引数の構造体の変数へのポインタは必要ありません。~
 +これによって、 WakeUp という関数が、より Parson 構造体に密接した関係であるように見えるようになります。~
 +また、メンバ関数の中では、メンバ変数にアクセスする際に parson.name のようにしていたような、変数名の必要がなくなります。~
 +詳しくはサンプルコードのメンバ関数の中で name や location に注目してください。~
 +このようなことを自動的にやるのが、メンバ関数というものなのです。
 +
 +以下のサンプルコードに前回のものと全く同等なプログラムを、メンバ関数を用いて表現します。
 +
 +** 今回のミソ [#tfc51be0]
 +- 構造体のメンバの変数をメンバ変数というのに対してメンバの関数のことをメンバ関数という
 +- メンバ関数のスコープには、同じ構造体(やクラス・共有体)のメンバも含まれる。
 +- メンバ関数を定義する場合は構造体(やクラス・共有体)の中に関数を記述する。
 +- メンバ関数を使用する場合は
 +#code(d,nomenu,nonumber,nooutline){{{
 +変数名.メンバ関数名(引数);
 +}}}
 +というようにしてアクセスします。
 +
 +
 +
 +** サンプルコード [#mb92deb2]
 +#code(d,sample1502p.d);
 +#region(Tango用はこちら){{
 +#code(d,sample1502t.d);
 +}}
 +
 +** 実行結果 [#rb6f5853]
 +#code(console){{{
 +$ dmd -run sample1502p.d
 +前原圭一は現在自室にいます。
 +前原圭一は自室のベッドで目を覚ました。
 +
 +前原圭一は現在自室のベッドにいます。
 +前原圭一は自室のベッドから食卓へ移動した。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は朝食を食べた。少し元気になった。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は食卓から学校へ移動した。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一はお昼の弁当を食べた。少し元気になった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は学校から家へ移動した。
 +
 +前原圭一は現在家にいます。
 +前原圭一は家から食卓へ移動した。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は夕食を食べた。少し元気になった。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は食卓から自室へ移動した。
 +
 +前原圭一は現在自室にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在自室にいます。
 +前原圭一は自室のベッドで眠りに就いた。
 +}}}
 +
 +
 +** まとめ [#odd27bec]
 +とりあえず、今回の利点はコードが読みやすくなる程度の御利益があるメンバ関数についてお話ししました。~
 +しかしながら、本来メンバ関数の実力はこんなものではありません。~
 +メンバ関数の本領は「ポリモーフィズム」とか「カプセル化」いうあたりでお話しします。~
 +あ、あとちなみに、メンバ関数ではない、今までやってきた普通の関数のことを、メンバ関数に対して「フリー関数」と呼ぶ場合があります。 覚えておくといつか得するかもしれません。~
 +とりあえず、その前段階として次章では「クラス(class)」について説明していきます。
 +
 +
 +* #summary - まとめ [#r92c8915]
 +** 第15章のミソ [#m069205a]
 +- オブジェクトの入り口は構造体をポインタで関数に渡すこと
 +- 種類や型を示す呼び方をオブジェクト志向では「クラス」という
 +- 種類や型に属する個を示す呼び方をオブジェクト志向では「インスタンス」という
 +- 構造体のメンバの変数をメンバ変数というのに対してメンバの関数のことをメンバ関数という
 +- メンバ関数のスコープには、同じ構造体(やクラス・共有体)のメンバも含まれる。
 +- メンバ関数を定義する場合は構造体(やクラス・共有体)の中に関数を記述する。
 +- メンバ関数を使用する場合は
 +#code(d,nomenu,nonumber,nooutline){{{
 +変数名.メンバ関数名(引数);
 +}}}
 +というようにしてアクセスします。
 +
 +** 宿題 [#b8375049]
 +今回のメンバ関数を用いて、サンプルコードに追加の関数、「Play」を付け加えましょう。~
 +学校から帰ったら遊ぶことにします。
 +#code(console){{{
 +前原圭一は現在自室にいます。
 +前原圭一は自室のベッドで目を覚ました。
 +
 +前原圭一は現在自室のベッドにいます。
 +前原圭一は自室のベッドから食卓へ移動した。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は朝食を食べた。少し元気になった。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は食卓から学校へ移動した。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一はお昼の弁当を食べた。少し元気になった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在学校にいます。
 +前原圭一は学校から家へ移動した。
 +
 +前原圭一は現在家にいます。
 +前原圭一は家から食卓へ移動した。
 +
 +前原圭一は現在家にいます。
 +前原圭一は家から自室へ移動した。
 +
 +前原圭一は現在自室にいます。
 +前原圭一はゲームをして遊んだ。ちょっと愉快になった。
 +
 +前原圭一は現在自室にいます。
 +前原圭一は自室から食卓へ移動した。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は夕食を食べた。少し元気になった。
 +
 +前原圭一は現在食卓にいます。
 +前原圭一は食卓から自室へ移動した。
 +
 +前原圭一は現在自室にいます。
 +前原圭一は勉強した。少し賢くなった。
 +
 +前原圭一は現在自室にいます。
 +前原圭一は自室のベッドで眠りに就いた。
 +}}}
 +
 +
 +** コメント [#se9fe4ae]
 +次回は、classについて取り扱っていきます。~
 +D言語風にオブジェクト指向をする場合はclassを主に使うことになると思います。
 +
 +そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~
 +
 +
 +
 +#navi
 +
 +
 +* 投票とコメント [#ed3e26a4]
 +#vote(#lastvote:206a499f93f4a947869c09788c67c8b7,大変参考になった[1],参考になった,あまり参考にならなかった,まったく参考にならなかった,#notimestamp)
 +#pcomment
  

  • Backup diff of Articles/D言語入門講座/第15章 - オブジェクト指向(No. All)
    • Cur: 2012-05-14 (Mon) 23:28:46 SHOO[3]
      • With "pcomment" plugin. (Only touched)