Factoryパターン 機能の追加

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たかし
記事: 48
登録日時: 12年前

Factoryパターン 機能の追加

#1

投稿記事 by たかし » 11年前

Factory パターンで機能の追加(耐久度をあらわすdurabilityというメソッドでuseをするたびに増えて3回useが呼び出されるとカードが壊れていると表示)をしたのですが、


D:・・・・・・
結城浩のカードを作ります。
とむらのカードを作ります。
佐藤花子のカードを作ります。
結城浩のカードを使います。
Exception in thread "main" java.lang.AbstractMethodError: framework.Product.durability()V
at Main.main(Main.java:16)
-- Press any key to exit (Input "c" to continue) --

とエラーが出てしまいます。

いかがプログラムです。

コード:

package framework;
public abstract class Product {
    public abstract void use();
	public abstract void durability();
	
}

コード:

package framework;
public abstract class Factory {

   /*
     final修飾子によりこのメソッドは継承させない
     このサンプルでは、createメソッドの処理は拡張できない作り。
    */
    public final Product create(String owner) {

        // ファクトリメソッドを使って、インスタンスの生成と、操作を行う。
        Product p = createProduct(owner);
        registerProduct(p);

        // インスタンスを返却
        return p; // Product型なのがポイント(具体的な製品クラスの親)
    }


    // ファクトリーメソッド
    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}

コード:

package idcard;
import framework.*;
public class IDCard extends Product {
    private String owner;
	private int d=0;

    // コンストラクタ
    IDCard(String owner) {
        System.out.println(owner + "のカードを作ります。");
        this.owner = owner;
    }

    // スーパークラスのメソッドをオーバーライド
    public void use() {
		System.out.println(owner + "のカードを使います。");
		d++;
    }
	public void durability() {
		if(d>=3){
			System.out.println(owner + "のカードは壊れています。");
		}
		else{
			System.out.println("このカードは" + d + "回使用されました");
			System.out.println("あと" + d-3 + "回使用できます。);

	}

    // このクラス固有の機能
    public String getOwner() {
        return owner;
    }
}

コード:

package idcard;
import framework.*;
import java.util.*;

public class IDCardFactory extends Factory {
    private List owners = new ArrayList();

    // ファクトリメソッドをオーバライド
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }
    protected void registerProduct(Product product) {
        owners.add(((IDCard)product).getOwner());
    }


    // このクラス固有の機能を追加
    public List getOwners() {
        return owners;
    }
}

コード:

import framework.*;
import idcard.*;
public class Main {
    public static void main(String[] args) {

        //  インスタンス生成するためのファクトリクラスのインスタンスを生成
        Factory factory = new IDCardFactory();

        // 振る舞いの違うインスタンスを生成
        Product card1 = factory.create("結城浩");
        Product card2 = factory.create("とむら");
        Product card3 = factory.create("佐藤花子");

        // 実行すると、インスタンスが異なるので振る舞いが違う。
        card1.use();
		card1.durability();
        card2.use();
        card3.use();

				
    }
} 

原因がわかりません。

よろしくお願いします。

Poco
記事: 161
登録日時: 14年前

Re: Factoryパターン 機能の追加

#2

投稿記事 by Poco » 11年前

IDCardクラスで、
System.out.println("あと" + d-3 + "回使用できます。");
とありますが、

"あと"(String型)
+(文字列の連結)
d(int型がString型に変換される)
-(What??)
3(int型がString型に変換される)
+(文字列の連結)
"回使用できます。"(String型)

となるはずなので-演算子って何?となって落ちているんじゃないのでしょうか?
#というか、これコンパイル通るんだ。。
d-3を先に計算させるために(d-3)としないとまずいのでは?

閉鎖

“C言語何でも質問掲示板” へ戻る