2013-06-10 3 views
0

меня такая ситуация, когдаСделать экземпляр производного класса экземпляра данный базовый класс в Java

class Parent { 
    int data; 
    public Parent(int data) { 
     this.data = data; 
    } 
} 

class Child extends Parent { 
    int childData; 
    public Child(int data, int childData) { 
     super(data); 
     this.childData = childData; 
    } 
} 

А на руках у меня есть экземпляр Parent. Я хочу добавить к нему функциональность childData. Я недавно программировал в Javascript, где это тривиально, и я мысленно портировал шаблоны проектирования, не понимая, что это нетривиально в Java.

Предполагая, что у меня есть полный контроль над кодом класса Child, что является лучшей практикой для этого? Могу ли я сделать это без клонирования? Нужно ли изменить класс Parent, чтобы заставить это работать?

Конечно в худшем случае (это звучит ужасно) есть такое решение:

new Child(parent.data, childData); 

С Parent данных «s все общественности.

Конкретная проблема (которую я, как правило, забывают включить в Java вопросы), я есть Config.testUser метод, который возвращает пользователю, и я хотел бы добавить одну точку привязки к нему, чтобы сделать его InitialScanUser, который является User с initialScanAlgorithm исходная дата тип InitialScanAlgorithm добавлен. Config.testUser живет в пакет, который не может быть зависеть от InitialScanAlgorithm.

+0

Не могли бы вы объяснить * почему * вы хотите это сделать? Возможно, пример может иллюстрировать, что вам нужно использовать для этого? –

+0

@ Code-Guru см. Редактирование – djechlin

ответ

0

Сделайте Parent экземплярами неизменяемыми, и вы можете просто делегировать экземпляр Parent.

См Effective Java, Item 16: Favor composition over inheritance.

+0

Под «делегатом» вы подразумеваете выполнение большого количества 'child.parent(). Method()'? – djechlin

0

Это не тривиальна. Класс экземпляра не может быть изменен (хотя он может быть ссылается на в качестве ссылки на суперкласс, но сам экземпляр не может измениться).

Более элегантный способ был бы (если вы используете конструкцию много), чтобы добавить конструктор, который принимает родительский экземпляр.

public Child(Parent parent, int childData) { 
    .... 
} 
+0

Как @MattBall предлагает, это действительно указывает на композицию против наследования. –