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();
}
}
原因がわかりません。
よろしくお願いします。