Каковы варианты или лучшие практики в том, как специализировать класс? - PullRequest
0 голосов
/ 15 сентября 2011

У меня уже есть созданный класс Person с соответствующими атрибутами; в конце концов, человек может стать сотрудником.

Используя наследование, Employee может быть подклассом Person. Как вы можете преобразовать («специализировать») это лицо в Employee без необходимости переноса всех его атрибутов в новый класс Employee?

Лучше ли иметь независимый (в отношении наследования) класс Employee с атрибутом типа Person (как часто встречается в БД)?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Это невозможно в Java.Объект имеет тип и не может получить новый.Если это человек, он всегда будет человеком и никогда не будет сотрудником.Вы можете создать новый объект типа Employee из Person, хотя:

public class Person {
    private String name;

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

    /**
     * copy constructor
     */
    protected Person(Person p) {
        this.name = p.name;
    }

    // ...
}

public class Employee extends Person {
    private String badge;

    public Employee(Person p, String badge) {
        super(p);
        this.badge = badge;
    }

    // ...
}
0 голосов
/ 15 сентября 2011

Насколько я понимаю, вопрос заключается в наследовании (is-A) или композиции (has-A)?

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

Чтобы быть конкретным - Сотрудник всегда Персона, поэтому , имеющий его в качестве подкласса, является правильным способом . Его можно смоделировать как композицию. Экземпляр Person, являющийся свойством класса Employee, но выражение «Employee has Person» (атрибут) звучит довольно странно, поэтому я бы этого не использовал, если у меня нет дополнительных причин для такого решения.

...