У вас есть «класс» на человека, который действительно ограничивает ваш дизайн; потому что, если вы хотите добавить ученика или учителя, вам нужно начать писать новый класс.
Классы - это шаблоны, и каждый шаблон используется для создания «экземпляра класса» или, более конкретно, «экземпляра». Один шаблон обычно используется для построения более одного класса (хотя для класса, который будет использоваться более одного раза, требуется , используя его один раз (или вообще не используя его).
Таким образом, вы могли бы сделать
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) {
...
}
}
Эта конструкция также создает другие проблемы, так как это означает, что сотрудник не студент, а студент не является членом персонала. В реальном мире иногда Персонал поступает на занятия, а Студенты могут брать на себя обучающие роли (подумайте о помощнике учителя).
Самый гибкий метод на самом деле не создает структурной дифференциации между учеником и персоналом, он различает их по способности.
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();
}
}
Однако эта структура радикально отличается от примера вы в настоящее время представлены в классе, и бок шаги уроки вы на самом деле, как предполагается, будут узнавать о наследовании.
Это был мой первый вариант, но я действительно не могу не чувствовать себя странно, имея 7 действительно похожих классов. – DaveQuinn
@PMMP Ну, как они похожи? Эта конструкция позволяет им не зависеть друг от друга. Если вы слишком тесно связаны друг с другом, и они меняются, вам придется перепроектировать вашу систему. – Aidanc
Возьмем, к примеру, студентский класс. Два из его подклассов будут бакалаврами и магистрантами. Для этой системы единственной разницей между ними является количество книг, которые они могут брать взаймы. – DaveQuinn