1

継承で構成されるクラスを構造化しようとしています。私が作成したクラス

  1. 主要

  2. リスト項目

  3. 図書館

  4. アイテム

  5. 音楽CD

  6. 映画

  7. 雑誌……etc

これがライブラリクラスです

    import java.util.ArrayList;

    public class Library {
    /**
    * itemList contains the List of all items in the library. 
    */
private ArrayList itemList;

/**
 * count of all the items in the library. 
 */
private int count;

public Library(){

}

/**
 * Add a new item to the list of items. 
 * @param newItem The new item to be added to the list.
 * @throws unisa.library.DuplicateItemException
 */

public void addItem(Item newItem) throws DuplicateItemException {
    itemList.add(newItem);
}

}

アイテムクラス、

    public class Item extends Person{
private String id;
private String name;
private boolean loaned;
//borrower?
private double cost;


public Item(String id, String name, boolean loaned, String borrower, double cost) {
    // TODO Auto-generated constructor stub
    super(borrower);
    this.id = id;
    this.name=name;
    this.loaned = loaned;
    this.cost = cost;
}

public String getID(String id){
    return id;
}
public String getName(String name){
    return name;
}
public boolean getLoaned(boolean loaned){
    return loaned;
}
public double getCost(double cost){
    return cost;
}

}

人物クラス、

    public class Person {

private String name;
private String address;
public Person(String name, String address){

    this.name = name;
    this.address = address;
}
public Person(String name){
    this.name = name;
}

}

本、映画、MusicCD はすべて同一です

    public class Book extends Item{
private String author;

public Book(String author, String id, String name, boolean loaned, String borrower, double cost){
    super(id, name, loaned, borrower, cost);
    this.author = author;
}

}

これらのクラスを使用する必要がありますが、正しい継承を適用​​したかどうかわかりません。

問題は、ライブラリオブジェクトを開始しているメインクラスにあります

テストを行う

    Library l1 = new Library();

および呼び出し方法

    l1.addItem(new Magazine(Magazine.frequency.day, "ID001","Vanity Not So Faire",      false,"New York", null, 5.95));

ここでは、Magazine クラス (book クラスと同じ) のオブジェクトを渡しています。関数宣言では、Item をコンテナーとして使用しています。addItem によって、アイテム (本、雑誌、DVD など) を追加する必要があります。関数宣言でどのコンテナを渡す必要があるか (addItem(?)) またはクラスの構造化に何か問題がありますか?

4

4 に答える 4

1

継承を「IS A(N)」関係と考えてください。構成を「HAS A(N)」関係と考えてください。

平たく言えば、本、映画、音楽CDなど、それぞれがアイテムです。

図書館には本や映画などがあります。より正確には、ライブラリにはアイテムのコレクションがあります。

実装によっては、人にはアイテムのコレクションがあり、図書館には人 (常連客や顧客など) のコレクションがあると言う場合もあります。上で示したように、人には名前や住所などの個人情報もあります。


そうは言っても、上で定義した継承と構成を使用してクラスを構築します。結果のクラスは次のようになります (フィールドとスーパークラスのみを示して、継承と構成を適切に使用する方法のアイデアを提供します)。

class Library {
  Collection<Item> items;
  Collection<Person> customers;
}

class Person {
  Collection<Item> items;
  String name;
  String address;
}

class Item {
  String id;
  String name;
  // etc.
}

class Book extends Item {
  String author;
}

class MusicCD extends Item {
  String artist;
}

// etc.
于 2013-10-23T06:33:52.757 に答える
0

私が間違っていることに最初に気づいたのは、なぜItem拡張がPerson..?なのかということでした。

次の問題は、本、雑誌、およびあなたが言う他のすべてのものに同じコードが含まれている場合、再利用性の概念が壊れているということです。

だから、夏化する

Person クラスは他のクラスによって拡張される必要はありませんが、彼はアイテムを借りる可能性があるため、クラス内のアイテムの参照を持つ可能性があります

public class Person {
  private ArrayList<Item> itemList;
  //more person specific code
}

Item クラスは次のような Person 参照を持つことができます

public class Item {
  Person borrower;
  //More Item specific code
}

アイテムはクラスによって拡張する必要があり、Mediaクラスを継承する特殊なクラスを構築できますMedia

public class Media extends Item {
  //media specific code
}


public class Movie extends Media {
  public enum Quality {FULL_HD, HD};
  //more Movie specific code
}

これはあなたに少しのアイデアを与えるかもしれません..

于 2013-10-23T06:37:19.633 に答える
0

Person クラスから始める必要があります。これは何も拡張しないはずです。次に、アイテムのリストと必要に応じて人のリストを含む基本クラスのライブラリを使用する必要があります。次にアイテムクラス。次に、アイテム クラスを拡張する Book クラス。同様に、MusicCD、Movie、Magazine は item クラスを拡張する必要があります。

于 2013-10-23T06:25:41.427 に答える