スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

オブジェクト指向入門 第10回 オブジェクトは何に属するかを変えられない

今回は、以前に書いたラモスの例を使って、オブジェクト指向言語では一工夫しないと表現出来ないモデルについて書いてみたいと思います。

あの時は、オブジェクトとインスタンスの違いを表現するために、ラモスという一つのオブジェクトが様々なインスタンスになる様子を、次のように書きました。

    // 生成直後にブラジル人のインスタンスとなる
    Brazilian RuyGoncalvesRamosSobrinho = new Person();

    // ラモスという名前のサッカー選手のインスタンスとなる
    FootballPlayer Ramos = RuyGoncalvesRamosSobrinho;

    // ラモス瑠偉という名前の日本人インスタンスとなり、ブラジル人のインスタンスではなくなる
    Japanese RamosRuy = RuyGoncalvesRamosSobrinho;
    RuyGoncalvesRamosSobrinho = null;

    // 引退したので、サッカー選手のインスタンスでもなくなる
    Ramos = null;

しかし、このソースはJavaやC#ではコンパイルが通りません。
一行目からコンパイルエラーになってしまいます。

この現象を理解するために、まずは例に出てくるクラス間の関係を図にしてみます。素直に描くと、クラス図は次のようになると思います。

ramos.jpg

この図とコードを対比すると、一行目で何が起こっているのか見えてきます。

    Brazilian RuyGoncalvesRamosSobrinho = new Person();

まず、右辺では基本クラスPersonクラスのオブジェクトを生成しています。
そして左辺に代入して、生成したオブジェクトをBrazilianのインスタンスとして扱おうとしています。
ベン図にすると次のようになります。

Venn.jpg

この図から、オブジェクトがベン図上を移動していることが判ります。
つまり、一行目が成立するには、ある集合(クラス)に属するオブジェクトが、別の集合(クラス)に属する存在に変わる必要があるのです。

この変わる事が、オブジェクト指向言語にできないことです。
ニ行目以降も同様です。オブジェクトがどのクラスに属するかは生成した時に決まり、途中で変える事はできないのです。


一方、派生クラスのオブジェクトを、基本クラスのインスタンス用変数へ代入する事は可能です。

    Member member = new PremiumMember();

ポリモーフィックな処理でよく見る書き方です。
これが可能なのは、派生クラスのオブジェクトはベン図上で動かなくても最初から基本クラスに属しているからです。

Venn2.jpg

ポリモーフィズムは、オブジェクトがどのクラスに属するかを変えない事が前提になっています。
代入しただけで変わると、様々なオブジェクトの振る舞いが全て基本クラスと同じになり、ポリモーフィズムが破綻してしまいます。


しかし、これはプレミアム会員が、普通の会員に戻れない事も意味しています。

オブジェクト指向言語でも、ブラジル人が日本人に帰化したり、普通の会員がプレミアム会員になったり/やめたり、RPGの主人公がクラスチェンジ(転職)する事を、直接的には表現できないのです。

このような時は、少し視点を変える事で回避します。


少し長くなりますので、次回に続きます。


■まとめ
  ・オブジェクトは、どの集合(クラス)に属するかを変えられない。
  ・生成した時に決まる。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

プロフィール

Author:きっぽ

カテゴリ
最新記事
最新コメント
最新トラックバック
月別アーカイブ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。