2012-04-25 3 views
0

Мне нужно создать систему управления библиотекой, и у меня возникли проблемы при попытке реализовать пользовательские типы или профили. У меня уже есть пользователь суперкласса и два других подкласса «Пользователь, ученик и учитель», каждый со своими «характеристиками». Дело в том, что я должен реализовать 7 типов пользователей (5 типов студентов и 2 типа клерков) в зависимости от количества книг, которые они могут брать, и количества времени, которое они могут хранить в книгах, пока они не вернут их. Это единственные 2 различия между классами.Типы пользователей в системе управления библиотекой

Как вы это реализуете? Наследование? Я ищу умный способ реализовать это, и мне бы хотелось услышать ваши мысли об этом.

спасибо.

ответ

2

Как хорошее эмпирическое правило, везде, где вы видите существительное в спецификации проекта, это хороший кандидат для класса. Если эти существительные имеют отношения в спецификации проекта, они, вероятно, тоже должны иметь один в вашем коде.

Все ваши люди будут вписываться в категорию User, поэтому, возможно, это должен быть интерфейс, который все они наследуют. Вдобавок из этого они, по-видимому, вписываются в две категории: Student и Staff, возможно, это также должны быть абстрактные классы/интерфейсы. Тогда у вас есть 7 конкретных классов. 2 наследующий Staff и 5 наследующий Student.

Таким образом, вы бы в конечном итоге с чем-то вроде этого .. enter image description here

Конечно, эта конструкция зависит от того, что каждый User должен делать то, что каждый Staff/Student должен делать, но я оставлю очень конкретные детали к вам.

+0

Это был мой первый вариант, но я действительно не могу не чувствовать себя странно, имея 7 действительно похожих классов. – DaveQuinn

+0

@PMMP Ну, как они похожи? Эта конструкция позволяет им не зависеть друг от друга. Если вы слишком тесно связаны друг с другом, и они меняются, вам придется перепроектировать вашу систему. – Aidanc

+0

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

1

У вас есть «класс» на человека, который действительно ограничивает ваш дизайн; потому что, если вы хотите добавить ученика или учителя, вам нужно начать писать новый класс.

Классы - это шаблоны, и каждый шаблон используется для создания «экземпляра класса» или, более конкретно, «экземпляра». Один шаблон обычно используется для построения более одного класса (хотя для класса, который будет использоваться более одного раза, требуется , используя его один раз (или вообще не используя его).

Таким образом, вы могли бы сделать

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(); 
    } 

} 

Однако эта структура радикально отличается от примера вы в настоящее время представлены в классе, и бок шаги уроки вы на самом деле, как предполагается, будут узнавать о наследовании.

Смежные вопросы