#java #subclass #hidden
#java #подкласс #скрыто
Вопрос:
У меня есть четыре класса. Класс Person
и еще три, Student
, Professor
, Tutor
, каждый из которых расширяет класс Person . Класс Person имеет 2 переменные studentID
и staffID
. Однако только студент может иметь studentID != null
, а преподаватели и профессора могут иметь staffID != null
. Теперь, при создании нового объекта Student, как я могу убедиться, что независимо от того, какой StaffID всегда остается нулевым? StaffID должен оставаться в классе Person, поэтому его нельзя перемещать.
Комментарии:
1. Сделайте переменные закрытыми и подклассируйте установщики, чтобы обеспечить соблюдение политики.
Ответ №1:
Весь смысл наследования заключается в том, что в родительский класс помещаются только значения и функции (члены), допустимые для родительского класса, а любые дочерние элементы помещаются в дочерний класс.
Не злоупотребляйте ОО, переходите staffID
в свой дочерний класс.
Мое предложение состояло бы в том, чтобы создать Staff
класс, который содержит staffID
, наследовать Person
его, а затем иметь Professor
и Tutor
наследовать от него. Затем переходите studentID
в Student
класс. Таким образом, только Professor
и Tutor
есть доступ к staffID
и Student
нет, и наоборот для studentID
. Все классы по-прежнему могут быть назначены Person
типу.
Комментарии:
1. К сожалению, Tutor является студентом, поэтому tutor фактически расширяет student и не может расширять staff. В качестве классов единственным различием между student и tutor на самом деле является StaffID .
2. Хорошо, так что отбрось эту идею
Staff
и двигайсяstaffID
дальшеProfessor
. Редактировать: Ура, эти голоса подняли мою репутацию выше 1337!
Ответ №2:
Создание интерфейсов для ограничения операций:
package main;
public interface IsStaff {
public void setStaffId(Integer staffId);
public Integer getStaffId();
}
package main;
public interface IsStudent {
public void setStudentId(Integer studentId);
public Integer getStudentId();
}
Создайте свой класс Person:
package main;
public class Person {
protected Integer studentId = null;
protected Integer staffId = null;
}
Создайте свои подклассы Student и Staff с интерфейсами для определения единственно разрешенных операций:
package main;
public class Staff extends Person implements IsStaff {
@Override
public void setStaffId(Integer staffId) {
this.staffId = staffId;
}
@Override
public Integer getStaffId() {
return staffId;
}
}
package main;
public class Student extends Person implements IsStudent {
@Override
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
@Override
public Integer getStudentId() {
return studentId;
}
}
А теперь создайте своих Наставников и Профессоров:
package main;
public class Tutor extends Staff {
}
package main;
public class Professor extends Staff {
}
Объекты класса Student не имеют операций, которые могут повлиять на идентификатор StaffID, а объекты класса Staff (включая подклассы Tutor и Professor) не имеют операций, которые могут повлиять на идентификатор StudentID. Добавляйте другие операции по мере необходимости (общие операции могут передаваться непосредственно пользователю).
В качестве бонуса вы можете использовать интерфейсы для лучшего определения методов, например:
public void assignParkingSpaceTo(IsStaff staffMember);
public void issueLateSlipTo(IsStudent student);
Ответ №3:
studentID
Должно быть членом Student
not Person
. Аналогично Professor
, и Tutor
оба должны расширять класс Faculty
, который имеет a staffId
, который, в свою очередь, расширяет Person
Ответ №4:
Сделайте эти переменные закрытыми и создайте getter и setter. В зависимости от класса реализуются различные методы поведения. Для stasfs — защитите параметр StudentID для student — защитите параметр StaffID.
Ответ №5:
не расширяйте класс Person. Вместо этого используйте композицию.
Если вам нужен полиморфизм, создайте интерфейс Blammy, который предоставляет общий интерфейс для студента, профессора и преподавателя. Идентификатор студента и идентификатор персонала могут быть или не быть частью интерфейса Blammy.
Каждый класс, студент, профессор и преподаватель будут содержать частный экземпляр Person и прокси для любой функциональности Person, которую они хотели предоставить.
У студента будет элемент данных StudentID, а у профессора и преподавателя будет элемент данных StaffID. getStudentId() для professor и tutor всегда возвращал бы null, а get StaffID для student также всегда возвращал бы null.
Ответ №6:
сделайте переменную закрытой, создайте геттеры и сеттеры. Затем сделайте так, чтобы ваш конструктор инициализировал обе переменные и просто передал null для идентификатора студента для учителей и null для StaffID для студентов.
конструктор —>
public Person(int staffID, int studentID){
this.staffID = staffID;
this.studentID = studentID:
}
при инициализации —->
Student student = new Person(null, 1234);