У меня следующая структура объекта:
class Annotation;
class LabelAnnotation: inherits Annotation;
class TextAnnotation: inherits LabelAnnotation;
Я хотел бы использовать объекты-создатели, чтобы выполнить некоторую инициализацию этих объектов (эта инициализация зависит от внешних настроек, поэтому я не хочу делать это в конструкторе этих объектов).
В частности, при создании LabelAnnotation я хотел бы сделать:
fontSize = AppDefaults.fontSize
Итак, пишу «создателю»:
class LabelAnnotationCreator {
LabelAnnotation create() {
annotation = LabelAnnotation()
annotation.fontSize = AppDefaults.fontSize
return annotation;
}
}
Теперь я хотел бы создать TextAnnotationCreator. Вот где я застрял: я не могу использовать LabelAnnotationCreator, потому что он создаст экземпляр LabelAnnotation, но, с другой стороны, я хочу извлечь выгоду из инициализации, выполняемой LabelAnnotationCreator.
class TextAnnotationCreator {
TextAnnotation create() {
annotation = TextAnnotation()
// I'm stuck here:
// can't do LabelAnnotationCreator().create()… ???
return annotation;
}
}
Очевидно, это неправильный шаблон, но я не уверен, как найти правильный.
Спасибо!
annotation.fontSize = AppDefaults.fontSize
имеют ли оба класса TextAnnotationCreator и LavelAnnotationCreator свойство fontSize?
Свойство fontSize находится не в классе создателя, а в классе LabelAnnotation. Класс TextAnnotation также имеет это, потому что он наследует класс LabelAnnotation.




что ты думаешь об этом:
class TextAnnotation {
private final int someOtherArgs;
private final int fontSize;
public TextAnnotation(LabelAnnotation labelAnnotation, int someOtherArgs) {
this(someOtherArgs, labelAnnotation.getFontSize());
}
public TextAnnotation(int someOtherArgs, int fontSize) {
this.someOtherArgs= someOtherArgs;
this.fontSize = fontSize;
}
}
создать конструктор на TextAnnotation, который строит объект из конфигурации LabelAnnotation. Тогда вы можете использовать это так:
TextAnnotation text = new TextAnnotation(someArgs,fontSize);
или используя вашего создателя
class TextAnnotationCreator {
TextAnnotation create() {
return
new TextAnnotation(
new LabelAnnotationCreator().create(),
someOtherArgs
);
}
}
Эти декораторы действительно элегантны, но, к сожалению, мне нужны LabelAnnotation и TextAnnotation как конкретные типы.
Я изменил свой ответ. Теперь я предлагаю использовать конструктор, который строит объект из другой конфигурации объекта.
Что вы хотите получить от инициализации объекта LabelAnnotationCreator?