2011-12-29 36 views
5

對不起,如果這是一個愚蠢的問題,但我想了解像.Net,Java這樣的語言中的單一根類(對象)層次結構的所有優點。獨立根類級別的優勢

我可以想到一個優點,假設我有一個函數,我想接受所有類型的(引用)數據類型。那麼在這種情況下,而不是寫每個數據類型的函數,我可以寫我的功能。

public void MyFun(object obj) 
{ 
// Some code 
} 

我們從這種類型的層次結構中獲得的所有其他優點是什麼?

+0

「理智」值得認真考慮;多重繼承往往不甚理解,並且使用不當......也許這是一個足夠的原因(使用其他接口) – 2011-12-29 15:36:54

+1

這個問題很好..我想知道它沒有upvotes .. – Anirudha 2013-01-06 16:28:23

回答

6

我還要舉從本好書一些線路 - Thinking in Java通過Bruce Eckel


所有對象的單根的層次結構有共同的接口, 所以他們最終都同類型。替代方案(由 C++提供)是您不知道所有內容都是基本相同的 類型。從向後兼容性的角度來看這符合的 C中的模型更好,可以爲限制較少被認爲是,但是當你想 做全面的面向對象編程則必須構建自己的 層次結構,以提供相同的便利這是內置於其他OOP 語言。並且在您獲取的任何新類庫中,都會使用其他一些不兼容的界面。它需要付出努力(並可能需要多次繼承)才能將新界面加入到您的設計中。 C++的額外「靈活性」值得嗎?如果你需要它 - 如果你在C上投入很大的資金 - 這是非常有價值的。如果從 開始,其他替代方法(如Java)通常可能更具生產力。


在一個單根的分層結構(例如Java提供)的所有對象可以被 保證有一定的功能。您知道您可以對系統中的每個對象執行某些基本操作。一個單獨的 紮根層次結構,以及創建堆上的所有對象,大大簡化了參數傳遞。


一個單根的層次結構使得它更容易實現垃圾收集 (被方便地內置到Java)。必要的 支持可以安裝在基類中,垃圾收集器 可以將適當的消息發送給系統中的每個對象。 如果沒有單獨的層次結構和系統通過引用操縱對象 ,則很難實現垃圾回收器。


由於運行時類型信息是保證中的所有對象, 你永遠不會有一個對象,其類型不能確定結束。 這對於系統級操作尤其重要,例如 異常處理,並允許在編程方面具有更大的靈活性。


2

單根層次結構不是將對象傳遞給方法,而是關於所有對象實現的通用接口。

例如,在C#中,System.Object實現了幾個從層次結構繼承下來的成員。

例如,這包括ToString(),它用於獲取對象的文字表示形式。你保證,對於每個對象,ToString()將成功。在語言級別,您可以使用此功能從(4-11).ToString()等表達式獲取字符串。

另一個例子是GetType(),它返回表示該方法被調用的對象的類型的System.Type類型的對象。因爲這個成員是在層次結構的頂部定義的,所以反射比C++更簡單,更統一。

+0

這裏有單根的層次結構I意思是每個類都由對象類繼承,我不是指多重繼承。從你的回答中,這是否意味着對象類的唯一優點是所有類都獲得了這四種默認方法? – 2012-01-06 11:47:16

0

單根的層次結構使平臺開發商有哪些簡化,可以對所有其他對象使用其他庫的發展的所有對象的一些最低知識。

想想收藏不GetHasCode,沒有反思的GetType等

0

它提供了一切的基礎。例如,在C#中的Object類中,它具有諸如ToString()和GetType()等方法的根,如果您不確定要處理哪些特定對象,這些非常有用。

也 - 不知道這將是一個好主意,但你可以在Object類創建擴展方法,然後每類的每個實例將能夠使用的方法。例如,您可以創建名爲WriteToLogFile的擴展方法(此對象o),然後讓它使用對象上的反射將其實例成員的詳細信息寫入日誌。當然有更好的方法來記錄事情,但這只是一個例子。

+0

感謝您的回覆。這裏的單根層次意味着每個類都由對象類繼承,我不是指多重繼承。從你的回答中,這是否意味着對象類的唯一優點是所有類都獲得了這四種默認方法? – 2012-01-06 11:42:19

+0

這就是它的意思,是的。 – PeteGO 2012-01-30 00:20:39