R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

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

の続きです。

どこからフォローすれば良いのかわからないので、先頭から順に行ってます。

今回は

型に入れる

というテーマです。

 

以下の C# で書かれたコードを見て下さい。


object r = new R・田中一郎();


R・田中一郎クラスのコンストラクタによって生成されたオブジェクトのインスタンスを r に代入しています。
変数r は、R・田中一郎型ではなく Object 型です。
しかし、何の問題もなくコンパイルできます。

最初に紹介したボタンコントロールも次のように書くことができます。


Button b  = new Button();
Control c = new Button();
object o  = new Button();


これは一体どういうことなのでしょうか?

R・田中一郎クラスは Object クラスから継承されています。
従って、R・田中一郎クラスのコンストラクタによって生成されたオブジェクトは、Object という型の持っている公開メンバを全て実装していることになります。
ですから、Object 型である r を通じて、object 型の持つどの公開メンバにアクセスしても、R・田中一郎オブジェクトは、これに対応するメンバを実装しているため、きちんとした振る舞いをすることができます。

以上のことから、あるクラスのコンストラクタによって生成されたオブジェクトのインスタンスは、継承したクラス、そのまた継承したクラス、そのまた継承したクラス・・・の型にキャストすることなく代入できるという規則が成り立ちます。

逆を考えてみましょう。


R・田中一郎 r = new Object();


これはコンパイルエラーになります。
何故なら、R・田中一郎型は、Objectオブジェクトに実装されたメンバの他にも、R・田中一郎クラス独自の公開メンバを持っています。
ですから、R・田中一郎型だけがもつ公開メンバにアクセスしても、Object クラスから生成されたオブジェクトは、そのメンバを実装していないので、どのような振る舞いをして良いのかわかりません。

では、次の場合はどうでしょうか?


object r = new R・田中一郎();
r.自己紹介();


r という Object 型は、自己紹介というメンバを持っていないのでコンパイルエラーになります。
しかし、r というオブジェクトは、そもそもR・田中一郎クラスのコンストラクタによって生成されているので、R・田中一郎型の持つメンバを実装しています。
なので、r という Object型をキャストすることは可能です。


R・田中一郎 r2 = (R・田中一郎)r;
r2.自己紹介();


このように、型・オブジェクト本体・オブジェクトのインスタンス、のように分けて考えると、それぞれの関係が良くわかるように思います。

投稿日時 : 2007年8月28日 13:56

Feedback

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/28 14:04 とりこびと

>--------------------------------------------------------------------------------

>R・田中一郎 r = new Object();

>--------------------------------------------------------------------------------

>これはコンパイルエラーになります。
>何故なら、R・田中一郎型は、Objectオブジェクトに実装されたメンバよりも多くのメンバを持っています。

メンバの数で決まるんですか?

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/28 14:14 R・田中一郎

メンバの数とは書いていないんだけどなぁ。

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/28 14:39 R・田中一郎

>Objectオブジェクトに実装されたメンバよりも多くのメンバを持っています。

Objectオブジェクトに実装されたメンバの他にも、R・田中一郎クラス独自のメンバを持っています。

の方がいいかな?
直そうっと。

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/28 16:55 IIJIMAS

こんにちはIIJIMAS@Rさんのファンです。

なんとなくこのやり取りが面白かったです。

>メンバの数で決まるんですか?

>メンバの数とは書いていないんだけどなぁ。

メンバの集合とインスタンスの集合の包含関係って逆転するんですね。

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/29 12:16 シャノン

> メンバの集合とインスタンスの集合の包含関係って逆転するんですね。

そそ。
集合論の用語で言えば、内包が増えれば外延が減るのですよ。

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/29 13:52 R・田中一郎

IIJIMAS さん

>こんにちはIIJIMAS@Rさんのファンです。

毎度ありがとうございます。

>なんとなくこのやり取りが面白かったです。

文章で人にものを伝えることがなんて難しいんでしょう、と思った瞬間でした。

>メンバの集合とインスタンスの集合の包含関係って逆転するんですね。

そうなんですよね。
なので、クッキー(お菓子の方ね)とクッキーの型で説明しようとすると破たんします。

-----------------------------------------------------------------
シャノン さん

>集合論の用語で言えば、内包が増えれば外延が減るのですよ。

集合論の用語で言われると、更に難しい希ガス。

# R流、一瞬でわかる.NETオブジェクト指向プログラミング入門13 2007/08/31 14:29 R.Tanaka.Ichiro's Blog

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門13

# R流、一瞬でわかる.NETオブジェクト指向プログラミング入門14 2007/09/06 18:52 R.Tanaka.Ichiro's Blog

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門14

タイトル
名前
Url
コメント