簡體   English   中英

在Java中,如何使子類的實例變量具有子類的類型,而不是父類的類型?

[英]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

無需重復代碼,也可能會達到目的。

請注意,一旦執行此操作,任何假定leftrightBinaryNode<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM