Каковы варианты или лучшие практики в том, как специализировать класс?

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

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

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

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


person htafoya    schedule 15.09.2011    source источник
comment
@downvoter, пожалуйста, помогите ОП улучшить его вопрос, а не молча понижать голосование и голосовать за закрытие.   -  person davin    schedule 15.09.2011
comment
Я не совсем понимаю вопрос - вы имеете в виду, что в конечном итоге хотите создать экземпляр Employee из Person? Тогда вам, вероятно, понадобится Employee.fromPerson(person) или что-то подобное.   -  person Dave Newton    schedule 15.09.2011


Ответы (2)


Это невозможно в 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;
    }

    // ...
}
person JB Nizet    schedule 15.09.2011

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

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

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

person Rostislav Matl    schedule 15.09.2011