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();
}
}
ただし、この構造は、クラスで提示されている例とは根本的に異なり、継承について実際に学ぶことになっているレッスンを回避しています。