我正在为一个继承自BinaryNode类的Java项目编写一个HuffmanTree类。我想使用HuffmanTree节点而不是BinaryNode节点。 BinaryNode具有BinaryNode类型的左右实例变量,我希望HuffmanTree具有相同的实例变量(即左和右),而不是类型为HuffmanTree。
我该怎么做呢?谢谢!
编辑:这是一些BinaryNode代码:
public class BinaryNode<T> implements BinaryNodeInterface<T>,
java.io.Serializable
{
//The BinaryNode's instance variables were changed to protected so we can access them
//from the HuffmanTree class.
private T data;
private BinaryNode<T> left;
private BinaryNode<T> right;
public BinaryNode()
{
this(null); // call next constructor
} // end default constructor
public BinaryNode(T dataPortion)
{
this(dataPortion, null, null); // call next constructor
} // end constructor
public BinaryNode(T dataPortion, BinaryNode<T> leftChild,
BinaryNode<T> rightChild)
{
data = dataPortion;
left = leftChild;
right = rightChild;
} // end constructor
答案 0 :(得分:1)
从类和接口的名称猜测,第一步是将左右声明更改为
protected BinaryNodeInterface<T> left;
protected BinaryNodeInterface<T> right;
然后你的BinaryNode
构造函数可以
public BinaryNode(T dataPortion, BinaryNode<T> leftChild,
BinaryNode<T> rightChild)
{
data = dataPortion;
left = leftChild;
right = rightChild;
} // end constructor
并且您的HuffmanTree
构造函数可以是
public HuffmanTree(T dataPortion, HuffmanTree<T> leftChild,
HuffmanTree<T> rightChild)
{
data = dataPortion;
left = leftChild;
right = rightChild;
} // end constructor
一切都应该奏效。您甚至可以将BinaryNode
构造函数更改为
public BinaryNode(T dataPortion, BinaryNodeInterface<T> leftChild,
BinaryNodeInterface<T> rightChild)
{
data = dataPortion;
left = leftChild;
right = rightChild;
} // end constructor
这也许可以解决问题,没有代码重复。
请注意,执行此操作后,必须更新假定left
和right
为BinaryNode<T>
实例的任何现有代码。最好的办法是将代码更改为仅依赖于BinaryNodeInterface<T>
,但这并非总是可行。
在BinaryNode
内部方法中,简单地投射:BinaryNode<T> node = (BinaryNode<T>) left;
应该是安全的(取决于您的方法的合同)。在HuffmanTree
方法中,调用HuffmanTree<T> node = (HuffmanTree<T>) left
可能不安全,因为left
可能是BinaryNode
而不是HuffmanTree
。你必须自己在这些情况下制定逻辑。