2014-06-05 97 views
2

我正在學習Haxe,到目前爲止,這似乎是一個非常漂亮的語言。但是,我很困惑以下。雖然the documentation沒有明確提到什麼,以下會導致編譯器錯誤:靜態方法不被繼承?

class HasMethod { 
    public static function doSomething() { 
     trace("Hello World"); 
    } 
} 

class Extender extends HasMethod {} 

class HelloWorld { 
    public static function main() { 
     HasMethod.doSomething(); 
     Extender.doSomething(); 
    } 
} 

也就是說,抱怨說:

HelloWorld.hx:12: characters 2-22 : Class<Extender> has no field doSomething 

我把它意味着靜態方法就是不繼承?是否有一個原因?它是底層遊戲形式的一個限制嗎?

回答

1

這是公平的假設,這是一個設計選擇,和明智的。

繼承是對象重寫某些行爲的一種機制。

Animal a = new Dog(); 
Animal b = new Cat(); 
// a and b, although both animals, they will behave differently 

什麼是靜態繼承點?這些功能是靜態的,它們直接屬於這個類。因此沒有實例化,也沒有多態性,在這種情況下,「繼承」靜態函數是沒有意義的。

3

聲明爲靜態的方法稱爲類方法。當您使用繼承時,您將創建其類從另一個類派生的對象(這就是爲什麼您可以使用父類的方法,但未聲明爲private)。換句話說 - 繼承的規則適用於從派生類實例化的對象。

類本身是沒有這樣一個對象,它解釋了爲什麼你不能叫Extender.doSomething();