Постановка проблемы: в учебной среде есть как студенты, так и сотрудники, у которых есть общие атрибуты, поскольку они оба являются людьми. В некоторых учебных заведениях студент может одновременно работать в качестве сотрудника. Последствия вышеизложенного в объектно-ориентированном программировании следующие: :

  • Student наследует Person
  • Staff наследует Person
  • В некоторых случаях объект Student и объект Staff должны быть построены на одном и том же экземпляре Person (т.е. совместно использовать один и тот же экземпляр родительского класса)

Как мне реализовать последнюю импликацию в списке с помощью ООП? (предпочтительно C#, Java, C++ или Python)

0
Joe 18 Янв 2022 в 15:33
4
Вы не знаете. каждый экземпляр является экземпляром сам по себе. То, что вы описываете, является композицией, а не наследованием
 – 
Stultuske
18 Янв 2022 в 15:38
Являются ли перечисленные вами последствия указанными в постановке задачи или это ваша собственная интерпретация?
 – 
Angela Lopez
18 Янв 2022 в 15:39
Lopez Первые два основаны на традиционных правилах ООП. Третье - это то, как я лично считаю, что описанный seinario должен быть реализован, но я открыт для других предложений.
 – 
Joe
18 Янв 2022 в 15:50

3 ответа

Я не думаю, что наследование - правильное решение вашей проблемы. Нужно ли, чтобы Student и Staff были разными классами?

Кажется, было бы более уместно, если бы студент или сотрудник были просто экземплярами Person, и было бы свойство члена role, которое может содержать "Student" или "Staff" или оба.

3
Karsten Gabriel 18 Янв 2022 в 15:43

С интерфейсом IPerson (интерпретируя наследование немного шире) вы можете сделать что-то подобное на Java (это близко, но, возможно, не сигара):

public interface IPerson
{

    default String getName() {
        return getPerson().getName();
    };

    default void setName(String name) {
        getPerson().setName(name);
    }

    IPerson getPerson();

}

public class Person implements IPerson
{

    private String name;

    @Override
    public String getName()
    {
        return name;
    }

    @Override
    public void setName(String name)
    {
        this.name = name;

    }

    public IPerson getPerson() {
        return this;
    }
}

public class Staff implements IPerson
{

    private Person person;

    private String socialInsuranceNumber;

    public String getSocialInsuranceNumber()
    {
        return socialInsuranceNumber;
    }

    public void setSocialInsuranceNumber(String socialInsuranceNumber)
    {
        this.socialInsuranceNumber = socialInsuranceNumber;
    }

    public Staff(Person person)
    {
        super();
        this.person = person;
    }

    @Override
    public IPerson getPerson()
    {
        return person;
    }

}

public class Student implements IPerson
{

    private Person person;

    private String matriculationNumber;

    public String getMatriculationNumber()
    {
        return matriculationNumber;
    }

    public void setMatriculationNumber(String matriculationNumber)
    {
        this.matriculationNumber = matriculationNumber;
    }

    public Student(Person person)
    {
        super();
        this.person = person;
    }

    @Override
    public IPerson getPerson()
    {
        return person;
    }

    public static void main(String[] args) {
        Person peterP = new Person();
        peterP.setName("Peter");

        Staff peterStaff = new Staff(peterP);
        peterStaff.setSocialInsuranceNumber("123");

        Student peterStudent = new Student(peterP);
        peterStudent.setMatriculationNumber("456");

        peterStudent.setName("Dr. Peter");

        System.out.println(peterStaff.getName());

    }

}

Без использования интерфейса вы можете переопределить все геттеры, сеттеры и тому подобное и делегировать их человеку (игнорируя поля в подклассе, что тоже нехорошо. Это композиция, замаскированная под наследование):

public class Student extends Person
{

    private Person person;

    private String matriculationNumber;

    public String getMatriculationNumber()
    {
        return matriculationNumber;
    }

    public void setMatriculationNumber(String matriculationNumber)
    {
        this.matriculationNumber = matriculationNumber;
    }

    public Student(Person person)
    {
        super();
        this.person = person;
    }

    @Override
    public String getName()
    {
        return person.getName();
    }

    @Override
    public void setName(String name)
    {
        person.setName(name);
    }

}
0
Turo 18 Янв 2022 в 17:28

Вы можете наследовать только один класс в java, у вас не может быть class WorkingStudent extends Student, Staff. Но вы можете реализовать несколько интерфейсов, поэтому я предложу вам решение с интерфейсами. Сначала давайте определим функциональность студента. Студент должен учиться, поэтому:

    public interface Student {
        
        void study();
    }

Теперь что касается персонала, он должен работать, очевидно, поэтому:

    public interface Staff {

        void work();
    }

Очень простой класс человека:

    public class Person {

        private final String name;


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

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

Средний студент только учится или нет, кто знает, но давайте предположим, что он учится. Он Личность, а также занимается студенческими делами.

    public class NormalStudent extends Person implements Student {

        public NormalStudent(String name) {
            super(name);
        }

        @Override
        public void study() {
            System.out.println(getName() + " studies a lot.");
        }
    }

А ваш среднестатистический персонал, который не очень добросовестно выполняет свою работу. Он Личность, и он делает штатные штучки.

    public class NormalStaff extends Person implements Staff {

        public NormalStaff(String name) {
            super(name);
        }

        @Override
        public void work() {
            System.out.println(getName() + " does whatever the staff does");
        }
    }

Теперь для студента, который также является сотрудником:

    public class WorkingStudent extends NormalStudent implements Staff {

        public WorkingStudent(String name) {
            super(name);
        }

        @Override
        public void work() {
            System.out.println(getName() + " has finished studying, but does not go to the party and instead does his obligations as a staff member of his university.");
            System.out.println(getName() + " has a bright future ahead of him. Probably.");
        }
    }

РабочийСтудент является НормальнымСтудентом, также Персоной(он наследует функционал для Студента от НормальногоСтудента и свойства Персона), и реализует Штат, получая соответствующий функционал.

И небольшой пример:

    NormalStudent james = new NormalStudent("James");
    james.study();
    WorkingStudent george = new WorkingStudent("George");
    george.study();
    george.work();
    NormalStaff john = new NormalStaff("John");
    john.work();
0
Chaosfire 18 Янв 2022 в 17:29