Java, как сделать так, чтобы переменная верхнего класса оставалась нулевой; как «скрыть» переменную от подкласса?

#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);