0

インターフェイスについての私の理解では、インターフェイスにはメソッド定義を含めることはできず、シグネチャと定数宣言のみを含めることができます。インターフェイス オブジェクトのコレクションを含む arraylist があります。この場合、次のようになります。

List< StoreItem > items = new ArrayList< StoreItem >();

StoreItem は、次のような私のインターフェイスです。

public interface StoreItem {
//Operations
public String getMaker();
public Patron getItemBuyer();
public Date getManufactureDate();
public String getManufacturer();
public String getProductName();
public void setItemBuyer(Patron purchase);
    }

新しいアイテムを作成してリストに追加するメソッドがあります。単体テストで問題が発生しておらず、例外がキャッチされていないという点で、問題なく動作しているようです。ただし、配列リストを印刷して自分の目で内容を確認したいという古典的な初心者の問題があり、StoreItem の toString メソッドをオーバーライドする必要があることを理解しています。しかし、StoreItem はインターフェースであり、明らかに、インターフェース内でこのようなことを行うことはできません。このインターフェイスを実装する抽象クラスと、その抽象クラスの 3 つのサブクラスもあります。これらのサブクラスのいずれかのオブジェクトを StoreItem として作成しているので、このサブクラス内で toString オーバーライドを実行しようとしました。私はこれを機能させることができません。私は試した:

public String toString(){
    return super.productName();
}

抽象スーパークラス productName 内ではプライベートであり、プロジェクトのために必要であるため、これは気に入らなかった. とにかく、まだ機能するかどうかを確認するために、productName を protected に変更することにしました。リストを印刷するときに、メモリの場所(@ d9sdf83jのようなもの)を取得するだけです。だから私はそれをプライベートに戻し、toStringが戻り時にスーパークラスからゲッターメソッドを使用するようにしようとしました:

public String toString(){
    return super.getProductName();
}

私はまだメモリの場所を取得しています。これが何が起こっているのか、何をしようとしているのかを描写するのに十分なコードかどうかはわかりません。エラーが初歩的なもので、私より賢い人が見つけて指摘できることを願っていますが、必要に応じてコードを追加できます。前もって感謝します。

私はまだそれを機能させることができません。実際のクラスを追加して、それが役立つかどうかを確認します。

public abstract class AbstractStoreItem implements StoreItem{

//attributes
private String product;
private Date manufactureDate;
private String manufacturer;
private String distibutor;
private Patron buyer;

//operations
public AbstractStoreItem(String product, String manufacturer, String distibutor, Date manufactureDate) {
    this.product = product;
    this.manufactureDate = manufactureDate;
    this.manufacturer = manufacturer;
    this.distibutor = distibutor;
}

@Override
public String toString() {
    return this.product;

}

@Override
public String getManufacturer() {
    // TODO Auto-generated method stub
    return manufacturer;
}

@Override
public Patron getBuyer() {
    // TODO Auto-generated method stub
    return buyer;
}

@Override
public Date getManufactureDate() {
    // TODO Auto-generated method stub
    return manufacturerDate;
}

@Override
public String getDistributor() {
    // TODO Auto-generated method stub
    return distributor;
}

@Override
public String getProduct() {
    // TODO Auto-generated method stub
    return product;
}

@Override
public void setBuyer(Patron buyer) {
    this.buyer= buyer;

}

}

これが抽象クラスのサブクラスです。これは私がリストに追加しているオブジェクトです:

public class Widget extends AbstractStoreItem{

//attributes
private Type type;
private int unitQuantity;

//operations
public Widget(String product, String manufacturer, String distributor, Date manufactureDate, Type gearType, int unitQuantity){
    super(product, manufacturer, distributor, manufactureDate);

    this.type = gearType;
    this.unitQuantity = unitQuantity;
}

public Type getType(){
    return type;
}

public int getUnitQuantity(){
    return unitQuantity;
}

@Override
public void setBuyer(Patron Buyer) {
    // TODO Auto-generated method stub

}

@Override
public String toString() {
    return super.getManufacturer();
}

}

toString メソッドをどうすればよいかわかりません。

4

1 に答える 1

0

追加するインスタンスtoStringを実装するクラスでオーバーライドする必要がありますStoreItemList

interface StoreItem {
    String name();
}

static class Pen implements StoreItem {

    @Override
    public String name() {
        return Pen.class.getName();
    }

    @Override
    public String toString() {
        return "Pen to String";
    }

}

public static void main(String[] args) {
    List<StoreItem> items= new ArrayList<StoreItem>();
    items.add(new Pen());
    System.out.println(items);
}

印刷します

 [Pen to String]
于 2012-12-14T17:51:12.527 に答える