<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>継承の例</title><revhistory><revision><revnumber>13</revnumber><date>2010-12-01 00:36:10</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>12</revnumber><date>2010-11-30 13:59:09</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>11</revnumber><date>2010-11-30 13:41:15</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>10</revnumber><date>2010-11-30 13:38:47</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>9</revnumber><date>2010-11-30 13:34:25</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>8</revnumber><date>2010-11-30 13:27:35</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>7</revnumber><date>2010-11-30 13:24:38</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>6</revnumber><date>2010-11-30 13:16:01</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>5</revnumber><date>2010-11-30 12:52:49</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>4</revnumber><date>2010-11-30 12:49:21</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2010-11-30 01:19:26</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2010-11-30 01:16:17</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2010-11-30 01:12:58</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>継承の例</title><para>前回までに作成した Chainクラス を継承して Cardクラス を作ります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=card1.png"/></imageobject><textobject><phrase>card1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>Cardクラスのインスタンスは３つの変数(属性)を持ちます。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=card2.png"/></imageobject><textobject><phrase>card2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>コンストラクタとshowメソッドを記述するとこのようになります。 </para><itemizedlist><listitem><para>１行目にextends...があることに注意 </para><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[class]]></token><![CDATA[ ]]><methodname><![CDATA[Card]]></methodname><![CDATA[ ]]><token><![CDATA[extends]]></token><![CDATA[ ]]><methodname><![CDATA[Chain]]></methodname>
<![CDATA[{]]>
<![CDATA[        ]]><methodname><![CDATA[String]]></methodname><![CDATA[ ]]><methodname><![CDATA[suit]]></methodname><![CDATA[;]]>
<![CDATA[        ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[rank]]></methodname><![CDATA[;]]>

<![CDATA[        ]]><methodname><![CDATA[Card]]></methodname><![CDATA[()]]>
<![CDATA[        {]]>
<![CDATA[        }]]>

<![CDATA[        ]]><methodname><![CDATA[Card]]></methodname><![CDATA[(]]><methodname><![CDATA[String]]></methodname><![CDATA[ ]]><methodname><![CDATA[suit]]></methodname><![CDATA[, ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[rank]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ]]><token><![CDATA[this]]></token><![CDATA[.]]><methodname><![CDATA[suit]]></methodname><![CDATA[ = ]]><methodname><![CDATA[suit]]></methodname><![CDATA[;]]>
<![CDATA[                ]]><token><![CDATA[this]]></token><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ = ]]><methodname><![CDATA[rank]]></methodname><![CDATA[;]]>
<![CDATA[        }]]>

<![CDATA[        ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[show]]></methodname><![CDATA[()]]>
<![CDATA[        {]]>
<![CDATA[                ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[printf]]></methodname><![CDATA[(]]><phrase><![CDATA["%s %d\n"]]></phrase><![CDATA[, ]]><methodname><![CDATA[suit]]></methodname><![CDATA[, ]]><methodname><![CDATA[rank]]></methodname><![CDATA[);]]>
<![CDATA[        }]]>
<![CDATA[}]]>
</programlisting></listitem></itemizedlist><para>コンストラクタとshowメソッドはこのように使えます。 </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[static]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[main]]></methodname><![CDATA[(]]><methodname><![CDATA[String]]></methodname><![CDATA[[] ]]><methodname><![CDATA[args]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ]]><methodname><![CDATA[Card]]></methodname><![CDATA[ ]]><methodname><![CDATA[a]]></methodname><![CDATA[;]]>
<![CDATA[                ]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[Card]]></methodname><![CDATA[(]]><phrase><![CDATA["ハート"]]></phrase><![CDATA[, 1);]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[show]]></methodname><![CDATA[();]]>
<![CDATA[        }]]>
</programlisting></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><section><title>代入</title><para>同じ型の変数にそのクラスのインスタンスを代入することができました。 </para><para>このとき変数の値は、インスタンスのアドレス(参照)と考えられます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[        Card a = new Card();
        Chain c = new Chain();]]></screen></listitem></itemizedlist><para>どんなインスタンスでも代入されるときはアドレスだとすると、 型の異なる変数への代入は可能でしょうか？ </para><itemizedlist><listitem override="none"><screen><![CDATA[        Card a = new Chain();
        Chain c = new Card();]]></screen></listitem></itemizedlist><para>１番目はエラー、２番目は可能です。 </para><para><emphasis role="strong">親クラスの型をもつ変数へ、サブクラスのインスタンスを代入することはできます。</emphasis> </para><para>次の２行をmainメソッドに記述して実行してみると </para><itemizedlist><listitem override="none"><screen><![CDATA[        Chain c = new Card();
        System.out.println(c);]]></screen></listitem></itemizedlist><para>このようになります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=card4.png"/></imageobject><textobject><phrase>card4.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>変数はChain型ですが、代入されているインスタンスはCard型です。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>オブジェクトをつなぐ</title><para>CardクラスはChainクラスを継承して作成したので、 Chainクラスのときと同様につなぐことができます。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=card3.png"/></imageobject><textobject><phrase>card3.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>変数nextへの代入によってつなぐことも可能ですが、 以下ではメソッドを使って操作することにします。 </para><para>Chainクラスで作成したaddとdelの２つのメソッドは 図の青で囲んだ部分に対して、追加や削除を行うものでした。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=chain51.png"/></imageobject><textobject><phrase>chain51.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>親クラスで定義されているメソッドはサブクラスでも利用できます。 </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[static]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[main]]></methodname><![CDATA[(]]><methodname><![CDATA[String]]></methodname><![CDATA[[] ]]><methodname><![CDATA[args]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ]]><methodname><![CDATA[Card]]></methodname><![CDATA[ ]]><methodname><![CDATA[a]]></methodname><![CDATA[;]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[Card]]></methodname><![CDATA[();]]>
<![CDATA[                ]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[add]]></methodname><![CDATA[(]]><token><![CDATA[new]]></token><![CDATA[  ]]><methodname><![CDATA[Card]]></methodname><![CDATA[(]]><phrase><![CDATA["ハート"]]></phrase><![CDATA[, 13));]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[add]]></methodname><![CDATA[(]]><token><![CDATA[new]]></token><![CDATA[  ]]><methodname><![CDATA[Card]]></methodname><![CDATA[(]]><phrase><![CDATA["ハート"]]></phrase><![CDATA[, 12));]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[showContent]]></methodname><![CDATA[();]]>
<![CDATA[        }]]>
</programlisting></listitem></itemizedlist><para>ここでもChain型の変数nextにサブクラスCardのインスタンスが代入されます。 </para><para>このmainメソッドを実行するとこのようになります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=card5.png"/></imageobject><textobject><phrase>card5.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>１番目のインスタンスの変数suitとrankには値が代入されていないことに注意してください。 </para><para>２番目以降につながっているインスタンスだけをリストの内容として扱うことにします。 </para><para>このため、表示にはshowContentを使っています。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>オブジェクトをつなぎなおす</title><para>変数bがこのようになっているとします。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=card6.png"/></imageobject><textobject><phrase>card6.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>先頭のインスタンスだけがあり、 リストの内容に対応するインスタンスはつながっていない状態です。 </para><itemizedlist><listitem override="none"><screen><![CDATA[                Card b;
                b = new Card();]]></screen></listitem></itemizedlist><para>を行うとこの状態になります。 </para><para><emphasis role="strong">問題</emphasis> </para><itemizedlist><listitem override="none"><para>変数a,bが上の状態だとします。 </para></listitem><listitem override="none"><para>この後、インスタンスをつなぎかえる処理だけで次の状態にしなさい。 </para><itemizedlist><listitem><para>新しいインスタンスを作ったり、suitやrankに代入してはいけません。 </para></listitem></itemizedlist></listitem><listitem override="none"><para>変数aの内容が変わってもよい。 </para></listitem><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E7%B6%99%E6%89%BF%E3%81%AE%E4%BE%8B?action=AttachFile&amp;do=get&amp;target=card7.png"/></imageobject><textobject><phrase>card7.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist></section></section></article>