靜態類別在程式設計上很普遍,表示不需要實例狀態的實體。然而,可能需要使用繼承將它們組織和建構為層次結構。但令人驚訝的是,這在許多語言中是不可能直接實現的。
這種特性引出了一個問題:為什麼靜態類別不能從其他類別繼承?為了回答這個問題,讓我們深入研究這個限制背後的設計考量。
根據前 C# 語言 PM Mads Torgersen 的說法,無法繼承靜態類別是故意的。爭論的焦點是靜態類別具有可公開存取的靜態成員,可以透過類別名稱直接存取這些靜態成員,從而使繼承變得多餘。此外,我們也觀察到了靜態類別繼承的不當使用,例如僅為了方便鍵入,因此不鼓勵使用靜態類別繼承。
channel9 的另一個觀點闡明了 .NET 中的繼承僅在基於實例的實體上運行。另一方面,靜態方法是在類型層級而不是實例層級定義的。因此,不支援重寫靜態方法,也不支援為它們建立虛擬表。
為了進一步澄清,實例方法有一個隱式的第一個參數,指向它們執行的物件。這是在類型層級定義的靜態方法中不存在的。這種缺失給編譯器在繼承過程中選擇適當的方法呼叫帶來了挑戰。
雖然禁止直接繼承靜態類,但單例模式作為可行的替代方案出現。此模式本質上建立靜態類別的「單例」實例,允許模擬類似實例的行為。
以上是為什麼程式語言中靜態類別不能繼承?的詳細內容。更多資訊請關注PHP中文網其他相關文章!