Что вы можете сделать, это:
public MyClassExtension(MyClass instance) {
super(...);
new_field = some_value;
}
При создании дочернего класса рекомендуется вызывать супер-конструктор (иначе супер-конструктор по умолчанию будет вызываться по умолчанию).
Почему так? Потому что это ограничивает количество раз, когда вам нужно переопределить одну и ту же инициализацию. Например, когда вы хотите создать объект со значениями по умолчанию. Вы делаете это только один раз, в родительском классе и вызываете по умолчанию супер-конструктор по умолчанию при создании подклассов. Вы также можете переопределить значения по умолчанию в подклассах, в зависимости от того, как вы определили свой класс.
Вот пример: при условии, что MyClass определен следующим образом:
class MyClass {
protected Object field1;
protected Object field2;
protected Object field3;
public MyClass(MyClass c) {
field1 = c.field1; // Remark: this is only the setup of
field2 = c.field2; // the reference. If you want to create a
field3 = c.field3; // copy, please do so with a constructor.
}
public MyClass(Object field1, Object field2, object field3) {
this.field1 = field1; // Same remark here
this.field2 = field2; // (about references).
this.field3 = field3;
}
}
Здесь вы видите, что MyClass
имеет 2 определенных конструктора: так называемый конструктор копирования, который принимает объект MyClass
в качестве параметра, и конструктор со всеми необходимыми полями.
Затем, когда вы хотите создать подкласс с объектом MyClass
в качестве параметра, вы можете сделать это:
class MyClassExtension extends MyClass {
private Object newField;
public MyClassExtension(MyClass c, Object newField) {
super(c);
this.newField = newField;
}
}
Но вы также можете сделать это:
class MyClassExtension {
private Object newField;
public MyClassExtension(MyClass c, Object newField) {
super(c.field1, c.field2, c.field3);
this.newField = newField;
}
}
Следовательно, вы ограничиваете количество обращений параметром объекта MyClass
, а конструктор подкласса MyClassExtension
является кратким.
Обратите внимание , что вам нужно предоставить этот код в том или ином месте в вашей программе. Вы должны определить своему компилятору, как создать MyClassExtension
с учетом MyClass
объекта. Либо код находится в MyClass
, либо оба в MyClass
и MyClassExtension
. Я только предоставляю способ уменьшить кодовую базу и ограничить количество необходимых изменений, если вы хотите что-то изменить в своем коде. С этим решением, если вы измените конструктор MyClass
, это повлияет и на MyClassExtension
(если вы не введете что-то другое).
Также обратите внимание , что вам нужно определить свои конструкторы копирования самостоятельно, потому что в противном случае компилятор просто не будет знать, хотите ли вы deep copy или просто reference копия. Больше информации здесь http://blog.amitinside.com/Copy-Constructor-in-Java/