Похоже, что вам действительно нужно изменить поведение как оригинальных A
, так и B
. В этом случае вы можете попробовать расширить оба класса (где расширение B
предназначено исключительно для указания немного другого фабричного метода для создания SubA
s).
class SubA extends A {
/** This is the one special aspect of SubA justifying a sub-class.
Using double purely as an example. */
private double specialProperty;
public double getSpecialProperty() { return specialProperty; }
public void setSpecialProperty(double newSP) { specialProperty = newSP; }
public SubA() {
super();
// Important differences between SubAs and As go here....
// If there aren't any others, you don't need this constructor.
}
// NOTE: you don't have to do anything else with the other methods of
// A. You just inherit those.
}
class SubB extends B {
// Purely for the purposes of a slightly different factory method
public A createA() {
return new SubA();
}
// Or if you need a static method
// (this is usually instead of the first choice)
public static A createA() {
return new SubA();
}
}
Обратите внимание, что на этом этапе вы можете создать один из ваших SubB
заводских объектов и сделать его похожим на оригинальный B
, например:
B myNewB = new SubB();
A myA = myNewB.createA();
Или, если вместо этого вы используете статическую фабрику, она не так близка (но близка).
A myA = SubB.createA();
Теперь, если вам действительно нужно что-то сделать с подчиненным свойством, вы получите доступ к нему через дочерний интерфейс. То есть, если вы создаете объект так:
SubA mySubA = SubB.createA();
mySubA.setSpecialProperty(3.14);
double special = mySubA.getSpecialProperty();
Изменить для обсуждения «Позднее добавление»:
На этом этапе ваш SubA-объект должен быть именно тем, что вы хотите. Он унаследует 50 методов от родителя (A), и вы можете добавить свое дополнительное свойство к потомку, а также к получателю и установщику. Я изменил код выше, чтобы проиллюстрировать, что я имею в виду.