在Java中,如何使子类的实例变量具有子类的类型,而不是超类?

时间:2014-04-13 18:13:55

标签: java class inheritance

我正在为一个继承自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

1 个答案:

答案 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

这也许可以解决问题,没有代码重复。

请注意,执行此操作后,必须更新假定leftrightBinaryNode<T>实例的任何现有代码。最好的办法是将代码更改为仅依赖于BinaryNodeInterface<T>,但这并非总是可行。

BinaryNode内部方法中,简单地投射:BinaryNode<T> node = (BinaryNode<T>) left;应该是安全的(取决于您的方法的合同)。在HuffmanTree方法中,调用HuffmanTree<T> node = (HuffmanTree<T>) left可能不安全,因为left可能是BinaryNode而不是HuffmanTree。你必须自己在这些情况下制定逻辑。