public Object value; public Tree left; public Tree right; ... }
對于這些類要注重的第一件事就是,兩種具體類都包含 Object 類型的 value 字段。假如您決定稍后讓樹包含,比如說,Interger,您也許會忘記更新其中的一個字段聲明。假如程序的其它部分需要這些字段是 Interger 的話,程序就很可能不會編譯。您或許記得您改變了其中一個類的 value 字段的類型,卻忽略了一個事實,就是您沒有在其它類中作相應的改變。
一些預防措施 當然,這個示例所示的錯誤是編程新手可以很快學會通過分解出公共代碼來避免的。在本例中,字段聲明應該移到 Tree 類中。它的兩個子類就會繼續這個字段,而且對字段聲明的任何改變都只需要在一個地方出現。
繼續看這個示例,我們可能還會編寫在一個 Tree 中相加和相乘所有節點的方法。為了簡單起見,我將以遞歸的方式來編寫這些方法。
// in class Tree:
public abstract int add(); public abstract int multiply();
// in class Branch:
public int add() { return this.value.intValue() + left.add() + right.add(); }
public int multiply() { return this.value.intValue() * left.multiply() + right.multiply(); }
// in class Leaf:
public int add() { return this.value.intValue(); } public int multiply() { return this.value.intValue(); }