解答例 - j2.lesson06.AbstractReceipt

package j2.lesson06;

/**
 * レシートの骨格を表すクラス.
 @author arakawa
 @version $Id: AbstractReceipt_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public abstract class AbstractReceipt implements Receipt {
    
    private final String[] names;
    private final int[] costs;
    private int itemCount;
    
    /**
     * インスタンスを生成する。
     */
    public AbstractReceipt() {
        super();
        this.names = new String[5];
        this.costs = new int[5];
        this.itemCount = 0;
    }

    /**
     * レシートに商品を追加する。
     @param name 商品名
     @param cost 価格
     */
    public void addItem(String name, int cost) {
        this.names[this.itemCount= name;
        this.costs[this.itemCount= cost;
        this.itemCount++;
    }

    /**
     * レシートの内容を表示する。
     * このクラスでは、次のように3つのパートに分けた部分を表示するメソッドを呼び出す。
     <pre>
     * showHeader();
     * showBody();
     * showFooter();
     </pre>
     @see #showHeader()
     @see #showBody()
     @see #showFooter()
     */
    public void show() {
        // show レシート上部
        showHeader();
        
        // show レシートの中身
        showBody();
        
        // show レシート下部
        showFooter();
    }

    /**
     * 合計金額を取得する。
     */
    public int getTotalAmount() {
        // return total of costs[0..itemCount]
        int total = 0;
        for (int i = 0; i < this.itemCount; i++) {
            total += this.costs[i];
        }
        return total;
    }

    /**
     * レシートの中身を表示する。
     */
    protected void showBody() {
        // for i = 0 .. itemCount - 1
        for (int i = 0; i < this.itemCount; i++) {
            // print names[i], 改行
            System.out.println(this.names[i]);
            // print "    " + costs[i] + "円", 改行
            System.out.println("    " this.costs[i"円");
        }
        // print 改行
        System.out.println();
        // print "合計:" + 合計金額 + "円"
        System.out.println("合計:" + getTotalAmount() "円");
    }

    /**
     * レシート上部を表示する。
     * このメソッドは子クラスで定義される必要がある。
     */
    protected abstract void showHeader();

    /**
     * このメソッドは子クラスで定義される必要がある。
     */
    protected abstract void showFooter();
}