Java расширяет альтернативы - PullRequest
3 голосов
/ 26 октября 2011

Я пытаюсь сделать модель наших вузов Система управления курсом (для курса).Я наткнулся на небольшое ограничение extends , то есть для определенного класса невозможно расширить два класса.Вот модель:

                     Professor
                    /                  
             Staff
          /          \                       
    Person            Tutor            
           \         /      
             Student            

Итак, я получаю Персонал и Профессионал, расширяющий Персонал, и Профессор.Теперь у меня небольшая дилемма с классом Tutor, который в основном является студентом (имеет studentID), но в некотором смысле является сотрудником университета (проводит групповые лекции, отвечает за определенный проект и т. Д.).Поскольку я не могу использовать два расширения, каковы другие альтернативы и, если возможно, кто-нибудь может привести очень простой пример с Implements ?Я видел пример интерфейса этого, но я не совсем уверен, как я могу использовать его в моей программе, так как Student не является интерфейсом?

Ответы [ 5 ]

8 голосов
/ 26 октября 2011

Не используйте наследование, используйте композицию: каждый человек - Персона, но у него одна или несколько ролей: студент, преподаватель, профессор, персонал.

Или, при желании, можно разделить персонал и студента и разрешить имиметь роли.Затем роли диктуют, что они могут или не могут делать.

4 голосов
/ 26 октября 2011

Вы можете сделать что-то вроде этого.

interface Person { ... }

interface Staff extends Person { ... }

interface Student extends Person { ... }

class Tutor implements Staff, Student { ... }

class Professor implements Staff { ... }

К сожалению, вы не можете поместить логику (т. Е. Поля или неабстрактные методы) в Staff и Student, потому что они обадолжны быть классами, а класс Java не может расширять два класса.

Вы можете сделать Student или Staff (но не оба) абстрактным классом, что позволит вам поместить логику вЭто.Это было бы отчасти не элегантно, поскольку нет концептуальной причины, по которой нужно быть абстрактным классом, а интерфейсом.В идеале они должны быть абстрактными классами, но для этого вам нужно переключиться на язык с MI.

interface Person { ... }

interface Staff extends Person { ... }

abstract class Student implements Person {
    long studentID;
    ...
}

class Tutor extends Student implements Staff { ... }

class Professor implements Staff { ... }
4 голосов
/ 26 октября 2011

Создание Student и Staff интерфейсов, реализованных Tutor.

Student объявит метод getStudentId(), а Staff объявит getLectures(), getProjects() и т. Д.

2 голосов
/ 26 октября 2011

Создание интерфейсов Person, Staff и Student. Если вам нужна общая функциональность, используйте инкапсуляцию.

0 голосов
/ 26 октября 2011

Как уже отмечали другие, чтобы сделать это в Java, вам нужно определить интерфейсы, а не суперклассы. Java не допускает множественные расширения.

Но может быть и лучшая альтернатива, чем наследование. В этой и почти любой ситуации, когда я испытываю желание подкласса расширить несколько суперклассов, я пытаюсь найти способ смоделировать ситуацию с делегированием, а не наследованием.

Создайте класс Person, который содержит набор объектов Role, где Role является интерфейсом, а Student и Staff реализуют Role. Тогда человек может иметь несколько ролей вместо того, чтобы «быть» несколькими типами людей.

...