У меня есть ClassA и ClassB, при этом ClassA является суперклассом.
ClassA использует NodeA, ClassB использует NodeB.
Первая проблема: параметры метода. ClassB нужны типы NodeB, но я не могу бросить от подкласса до суперкласса. Это означает, что я не могу установить свойства, которые уникальны для NodeB.
Вторая проблема: Когда я должен добавить узлы toClassB, я должен инстанцировать нового NodeB. Но, я не могу сделать этого в суперклассе, таким образом, я должен был бы переписать вставку для использования NodeB.
Существует ли путь вокруг этого или я оказывающийся перед необходимостью переписывать все это?
Возможно, вы ищете что-то вроде этого?
class NodeA { ... }
class NodeB extends NodeA { ... }
class ClassA<N extends NodeA> {
public Node newNode() { return new NodeA(); }
public void setProperties(Node n) { setPropertiesA(n); }
}
class ClassB extends ClassA<NodeB> {
@Override
public NodeB newNode() { return new NodeB(); }
@Override
public void setProperties(NodeB n) { setPropertiesB(n); super.setProperties(n); }
}
Это примерно то, о чем вы просите?
В частности, обратите внимание, как ClassB переопределяет addNode для возврата подкласса, а setProperties «связаны» для установки свойств NodeB, когда это необходимо.
Лучшее решение вашего затруднительного положения, я думаю, - использовать обобщения: поместить общий код в (возможно абстрактный) общий суперкласс, параметризованный, скажем, NodeType
. Каждый из A и B может создавать подклассы соответственно CommonSuper
и CommonSuper
и переопределять, где необходимо, делать что-то определенное для их индивидуального типа узла. Таким образом, у вас будет очень мало дублирования в вашем коде, но вы сможете выполнить все, что вам нужно.