gpt4 book ai didi

java - 在Java中,如何使子类的实例变量具有子类的类型,而不是父类(super class)的类型?

转载 作者:行者123 更新时间:2023-12-01 13:08:56 26 4
gpt4 key购买 nike

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

最佳答案

从类和接口(interface)的名称猜测,第一步是将 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 的现有代码都将被删除。和rightBinaryNode<T> 的实例将不得不更新。最好的办法是将代码更改为仅依赖 BinaryNodeInterface<T> ,但这并不总是可能的。

内部BinaryNode方法,简单地转换应该是安全的(取决于你的方法的契约(Contract)): BinaryNode<T> node = (BinaryNode<T>) left; 。在 HuffmanTree方法,调用 HuffmanTree<T> node = (HuffmanTree<T>) left 可能不安全,自 left可能是BinaryNode不是HuffmanTree 。您必须自己弄清楚这些情况下的逻辑。

关于java - 在Java中,如何使子类的实例变量具有子类的类型,而不是父类(super class)的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23046449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com