【问题标题】:In Java, how do I make instance variables of a subclass have the type of the subclass, rather than of the superclass?在Java中,如何使子类的实例变量具有子类的类型,而不是超类的类型?
【发布时间】:2014-04-13 18:13:54
【问题描述】:

我正在为继承自 BinaryNode 类的 Java 项目编写 HuffmanTree 类。我想使用 HuffmanTree 节点而不是 BinaryNode 节点。 BinaryNode 具有 BinaryNode 类型的 left 和 right 实例变量,我希望 HuffmanTree 具有相同的实例变量(即 left 和 right),但改为 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

【问题讨论】:

标签: java class inheritance


【解决方案1】:

从类名和接口名推测,第一步是把left和right的声明改成

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&lt;T&gt; 实例的现有代码都必须更新。最好的办法是将代码更改为仅依赖BinaryNodeInterface&lt;T&gt;,但这并不总是可行的。

在BinaryNode 方法中,简单地转换:BinaryNode&lt;T&gt; node = (BinaryNode&lt;T&gt;) left; 应该是安全的(取决于您的方法的合同)。在HuffmanTree 方法中,调用HuffmanTree&lt;T&gt; node = (HuffmanTree&lt;T&gt;) left 可能不安全,因为left 可能是BinaryNode 而不是HuffmanTree。您必须自己弄清楚这些情况下的逻辑。

【讨论】:

  • 将 left 和 right 的声明更改为 protected 并使用 BinaryNoteInterface 声明给了我一堆错误,说我无法将 BinaryNodeInterface 转换为 BinaryNode。
  • 如果我这样做,它会搞砸我所有的其他方法。编辑:没关系我把它修好了。谢谢!
  • 绝对是选角。这样做很痛苦,但现在可以了。
  • 相应地更新了答案
猜你喜欢
  • 2015-10-07
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多