天天看點

《Hack與HHVM權威指南》——1.5.2 覆寫方法的類型

在hack的代碼之間,繼承是更加複雜的互相關系中的一種。這複雜性主要來自于當繼承關系被建立時,繼承和被繼承的代碼之間的分離現象。舉例來說,如果你有個類型标注為someclass的對象并可以調用這個對象的某個方法,那麼你可以調用繼承自someclass的任何類的某個方法。這個調用仍然需要是類型安全的,這就意味着覆寫其他方法的時候,方法的類型必須有一定的規則。

在一個覆寫方法中,參數類型必須和被覆寫的方法類型完全一緻。這主要是因為繼承自php的一個行為。在php中,任何覆寫自抽象方法或者接口中聲明的覆寫方法,都必須精确地比對被覆寫方法的參數類型。這在未來hack版本中的聲明可能會有所改變,允許改變方法的參數類型将是更通常的做法。

換句話說,當進行方法覆寫時,覆寫方法的傳回類型并不一定保持相同,相對于被覆寫的方法而言,覆寫方法可以有一個更加明确的傳回類型。例如:

雖然改變了傳回類型,這種多态的調用仍然是類型安全的。

function f(parentclass $obj) {

$number = $obj->generate();

// 即使$obj是個childclass執行個體,generate()方法自然會傳回num類型

// 因為childclass::generate() 傳回的是int類型,而所有int類型都屬于num類型

用更通常的傳回類型進行覆寫是非法的。例如,如果childclass的generate()方法被聲明成傳回類型為mixed的話,類型檢查器将會報告錯誤。