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.自己紹介();
このように、型・オブジェクト本体・オブジェクトのインスタンス、のように分けて考えると、それぞれの関係が良くわかるように思います。