[英]In Java, how do I make instance variables of a subclass have the type of the subclass, rather than of the superclass?
我正在為從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
從類和接口的名稱猜測,第一步是將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<T>
實例的現有代碼都必須進行更新。 最好的辦法是將代碼更改為僅依賴BinaryNodeInterface<T>
,但這並不總是可能的。
在BinaryNode
方法內部,簡單地進行BinaryNode<T> node = (BinaryNode<T>) left;
(取決於您的方法的約定)應該是安全的: BinaryNode<T> node = (BinaryNode<T>) left;
。 在HuffmanTree
方法中,調用HuffmanTree<T> node = (HuffmanTree<T>) left
可能並不安全,因為left
可能是BinaryNode
而不是HuffmanTree
。 在這種情況下,您必須自己弄清楚邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.