0

ライブラリ管理システムを構築する必要があり、ユーザー タイプまたはプロファイルを実装しようとしているときに問題が発生しました。私はすでにスーパークラスのユーザーと、それぞれ独自の「特性」を持つユーザー、学生、教師の 2 つのサブクラスを取得しています。問題は、借りることができる本の数と、返却するまで本を保管できる期間に基づいて、7 種類のユーザー (学生 5 種類、事務員 2 種類) を実装する必要があるということです。これらは、クラス間の唯一の2つの違いです。

これをどのように実装しますか?継承?これを実装する賢い方法を探しています。これについてのあなたの考えを聞きたいです。

どうもありがとうございました。

4

2 に答える 2

2

経験則として、プロジェクト仕様で名詞が見られる場所はどこでも、クラスの適切な候補です。それらの名詞がプロジェクト仕様で関係を持っている場合、それらはおそらくあなたのコードでも持つべきではありません。

あなたのすべての人々は のカテゴリに当てはまるUserので、おそらくこれは、すべての人が継承するインターフェイスである必要があります。このことから、それらは 2 つのカテゴリに当てはまるように見えますがStudentStaffおそらくこれらも抽象クラス/インターフェースである必要があります。次に、7つの具象クラスがあります。2 継承Staffと 5 継承Student

だから、あなたはこのようなものになってしまうでしょう.. ここに画像の説明を入力

もちろん、この設計は、every が何をしUserなければならないか、every Staff/が何をしなければならないかによって異なりStudentますが、非常に具体的な詳細はお任せします。

于 2012-04-25T00:04:21.813 に答える
1

1 人あたりの「クラス」があり、それによってデザインが制限されます。生徒または教師を追加する場合は、新しいクラスの作成を開始する必要があるためです。

クラスはテンプレートであり、各テンプレートは「クラスのインスタンス」またはより具体的には「インスタンス」を構築するために使用されます。通常、1 つのテンプレートを使用して複数のクラスを構築します (ただし、クラスを複数回使用する必要はありませんが、1 回使用する (またはまったく使用しない) ことは問題ありません)。

だからあなたはできる

public class Student {

  private String name;

  public Student(String name) {
    this.name = name;
  }

  public string getName() {
    return this.name;
  }

}

public class Staff {

  private String name;

  public Staff(String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }

}

ご覧のとおり、スタッフと学生の間で多くの重複が発生します。 getName()getAge()getPhoneNumber()getAddress()などは両方に簡単に適用できます。つまり、この構造では、 と の両方でこれらのメソッドを複製する必要がStudentありStaffます。

職員と学生の共通点は何ですか?それらは両方Peopleであり、一般的な方法の多くはすべての人に共通です。

public class Person {

  private String name;

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

  public String getName() { 
    return this.name;
  }
}

public Staff extends Person {

  public void teachClass(Class class) {
    ...
  }

}

public Student extends Person {

  public void attendClass(Class class) {
    ...
  }

}

この設計は、スタッフ メンバーが学生ではなく、学生がスタッフ メンバーではないことを意味するため、他の問題も引き起こします。現実の世界では、スタッフがクラスに登録することがあり、学生は教育の役割を担うことができます (教師の補佐を考えてください)。

最も柔軟な方法は、実際には学生とスタッフの間に構造的な違いを生み出すのではなく、能力によって 2 つを区別します。

 public class Person {

   public Person(String name) {
     ...
   }

   public void canTeach(Course course) {
     teaching.add(course);
   }

   public void attending(Course course) {
     attending.add(course);
   }

   public boolean isStaff() {
     return !teaching.isEmpty();
   }

   public boolean isStudent() {
     return !attending.isEmpty();
   }

 }

ただし、この構造は、クラスで提示されている例とは根本的に異なり、継承について実際に学ぶことになっているレッスンを回避しています。

于 2012-04-25T00:42:31.240 に答える