Можно ли использовать наследование в этой ситуации? (Джава) - PullRequest
1 голос
/ 11 мая 2010

У меня есть ClassA и ClassB, а ClassA - суперкласс.

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

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

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

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

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Возможно, вы ищете что-то подобное?

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

1 голос
/ 11 мая 2010

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

...