2010-05-11 2 views
1

У меня есть ClassA и ClassB, а ClassA - суперкласс.Можно ли использовать наследование в этой ситуации? (Java)

ClassA использует NodeA, ClassB использует узел NodeB.

Первая проблема: параметры метода. ClassB нуждается в типах NodeB, но я не могу отличить их от подкласса к суперклассу. Это означает, что я не могу установить свойства, уникальные для NodeB.

Вторая проблема: когда мне нужно добавить узлы toClassB, мне нужно создать новый узел NodeB. Но я не могу сделать это в суперклассе, поэтому мне пришлось бы переписать вставку для использования NodeB.

Есть ли способ обойти это или мне придется переписать все это?

+0

Является ли NodeA суперклассом NodeB? –

+0

Вы говорите о параллельной иерархии? Можете ли вы быть более конкретными? – andyczerwonka

+0

Да, это параллельная иерархия и да, NodeA является суперклассом NodeB –

ответ

1

Лучшим решением для вашего затруднения, я думаю, является использование дженериков: поместите общий код в (возможно, абстрактный) общий суперкласс, параметризованный, скажем, NodeType. Каждый из A и B может подклассифицировать соответственно CommonSuper<NodeA> и CommonSuper<NodeB> и переопределять, если необходимо, что-то конкретное для своего типа отдельных узлов. Таким образом, у вас будет очень мало дублирования в вашем коде, но вы сможете выполнить все, что вам нужно.

1

Возможно, вы ищете что-то вроде этого?

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, когда это необходимо.