2010-05-05 3 views
0

У меня есть класс иерархии/наследование как это:Как копировать экземпляры суперкласса общего типа в экземпляры подкласса?

public class A { 
    private String name; 
    // with getters & setters 
    public void doAWithName(){ 
     ... 
    } 
} 

public class B extends A { 
    public void doBWithName(){ 
     // a differnt implementation to what I do in class A 
    } 
} 

public class C extends B { 
    public void doCWithName(){ 
     // a differnt implementation to what I do in class A and B 
    } 
} 

Так в одно время есть экземпляр класса А с полем «Имя» инициализирован. Позже я хочу, чтобы этот экземпляр A был завернут в экземпляр B или C. Поэтому суперклассы должны быть обернуты подклассом!

Как я могу сделать это наиболее эффективным в отношении СУХОЙ?
Я думал о конструкторе, который делает некоторое копирование с помощью геттеров/сеттеров. Но в этом случае я должен повторить себя - и это больше не относится к моему первоначальному требованию DRY!

Итак, как я могу деформировать A до B, просто инициализируя новые поля B (со значениями по умолчанию) и делегируя остальное на метод в A (который знает больше B, по каким полям A должен быть доступ ...).

Таким же образом:
Если A должны быть обернуты в С только метод в C должен INIT «новые» поля Си, в делегат метода оберточной Б (который, следовательно, inits «новых» полей Б в C) и на последние B делегаты A, которые копируют свои поля в поля C).

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

ответ

2

Кажется, что вы просто хотите реализовать Decorator Pattern.

+0

Но разве это не означает переписать все геттеры/сеттеры из суперкласса? Я хочу делегировать вызовы суперклассу. То есть предполагая имя свойства в классе A (с getName/setName), поэтому при использовании класса DecoratorPattern B не распространяется класс A. B получает только ссылку на A как параметр конструктора B. Таким образом, для вызова метода getName() B нужно иметь метод «getName()», который делегирует этот вызов экземпляру A (который B ie хранит как личное поле: например: return this.instanceOfA.getName ()). – gerry

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