引用

2012-05-01 27 views
1

考慮到如下因素的抽象類的抽象類的方法體的子類的靜態字段,在僞引用

abstract public class Bug { 
    private static int BREEDTIME; 

    public void breed() { 
    if (this.age % this.BREEDTIME) { 
     world.setAt(new this.class(newX, newY, this.world); 
    } 
    } 
} 

public class Ant extends Bug { 
    private static int BREEDTIME = 3; 
} 

public class Doodlebug extends Bug { 
    private static int BREEDTIME = 8; 
} 

有沒有辦法來定義品種()方法,使得它取決於BREEDTIME任何子類都在調用它? bug的每個子類都保證有BREEDTIME初始化。另外,螞蟻應該培育其他螞蟻,所以稱爲內部品種()的構造函數必須是調用品種()的子類類型的構造函數。

我在這兒吠錯了樹嗎?

+0

在PHP中,這稱爲[*晚靜態綁定*](http://php.net/manual/) en/language.oop5.late-static-bindings.php),但它在Java中不可用。 –

回答

5

我會用抽象的方法來做到這一點。在你的超類中定義getBreedTime()作爲抽象,然後在每個子類中實現它以返回適當的常量。

你不能真正做你想用這樣的靜態字段。

+0

解決了現場問題,但不是解決了爲螞蟻調用正確的構造函數new Ant()等問題。 –

+0

通常,您將使用此工廠並定義像BugFactory.createAnt()這樣的方法,該方法將返回Ant對象。 –

+0

@AustinYun - 您可以使用在抽象類上定義並在每個子類中實現的類似工廠方法來實例化正確的子類。 –

0

它不能這樣做。靜態字段也被繼承。只需刪除靜態關鍵字。如果你不想加倍整數,那麼你可以創建抽象方法getTime或創建枚舉:

abstract class Bug { 
    private int age; 
    public void breed() { 
     if (this.age % BREEDTIME.valueOf(this.getClass().getName()).getTime() == 0) { 
     } 
    } 
} 

class Ant extends Bug { 
} 

class Doodlebug extends Bug { 
} 

enum BREEDTIME { 
    Ant(3), 
    Doodlebug(8); 

    private BREEDTIME(int time) { 
     this.time = time; 
    } 

    public int getTime() { 
     return time; 
    } 

    private int time; 
}