我有 ClassA 和 ClassB,其中 ClassA 是超类。
ClassA 使用 NodeA,ClassB 使用 NodeB。
第一个问题:方法参数。ClassB 需要 NodeB 类型,但我不能从子类转换为超类。这意味着我无法设置 NodeB 独有的属性。
第二个问题:当我需要向ClassB添加节点时,我必须实例化一个新的NodeB。但是,我不能在超类中这样做,所以我必须重写插入以使用 NodeB。
有没有办法解决它,还是我必须重写整个事情?
我有 ClassA 和 ClassB,其中 ClassA 是超类。
ClassA 使用 NodeA,ClassB 使用 NodeB。
第一个问题:方法参数。ClassB 需要 NodeB 类型,但我不能从子类转换为超类。这意味着我无法设置 NodeB 独有的属性。
第二个问题:当我需要向ClassB添加节点时,我必须实例化一个新的NodeB。但是,我不能在超类中这样做,所以我必须重写插入以使用 NodeB。
有没有办法解决它,还是我必须重写整个事情?
我认为,解决您的困境的最佳方法是使用泛型:将公共代码放在一个(可能是抽象的)公共超类中,例如,NodeType
. A 和 B 中的每一个都可以分别子类化CommonSuper<NodeA>
和CommonSuper<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 的属性。