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