2013-08-22 312 views
0

假設您有一組對象,它們排列在一個層次結構中。也就是說,有一個包含所有對象的對象,那麼這個對象指的是同一類型的幾個對象,但是在較低的層次上,並且這些對象中的每一個都指向同一類型的幾個對象,而較低級別的對象,以此類推可變數量的步驟。例如,讓我們考慮這些對象是政府,所以最高級別是全球性的,那麼全球會有國家和部落,國家會有城鎮,城鎮會有房子和企業等等。所有這些政府都推廣了政府抽象類,所以它們都有相同的類型。通用嵌套for循環

我需要遍歷整個層次結構中的所有對象,但因爲我不知道運行時的完整結構,所以我必須以廣義的方式來完成。我只知道確實存在一個全球性的政府,然後我必須檢查哪些子政府必須進行。

我發現這樣做的一種方法是給超類一個名爲getSubGovs()的函數,它返回所有子政府的列表,以及這些子政府每個從getSubGovs()返回的內容。我希望這是有道理的。這是一個很好的方式來解決這個問題。

我正在尋找的是一種方法來做到這一點,而不必添加一個函數到超類,在我正在處理一個API的情況下,不能修改超類。什麼將是一個優雅的方式來做到這一點?

+0

是否要對結構中的所有對象執行通用操作?如果是這樣,什麼類型的操作?如果不是,你爲什麼要迭代它? – Bohemian

回答

0

這種結構被稱爲tree

通常情況下,每個樹節點具有相同類型,具有getChildren()方法或類似的 - 你的情況getSubGovs()。聽起來每個班都有自己的方式讓孩子們,所以一個簡單的抽象是不可能的。

要應用的標準軟件模式可以通用方式瀏覽樹,但是由於您無法修改類,因此您也可能需要facade pattern

0

我不是100%肯定你想達到什麼,但我相信你會想在這裏什麼是多態,即繼承虛函數(我不知道你所使用的語言,但C++中,例如,支持這個)。

基本上,你會作出全球政府基類,和所有其他類的派生類這將繼承全球政府(或對方)。通過繼承,您可以建立您想要的層次結構(例如,通過在層次結構中繼承上級的層次結構中的類降低)。

此頁包括繼承: http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

現在的迭代部分:第一 ,你聲明函數/方法虛擬(使用關鍵字虛擬)在基類(如全球政府)。派生類將覆蓋此函數並根據需要對其進行自定義。請注意,您不需要派生類中的virtual關鍵字。

以下是一個很酷的部分:當您在遍歷子類和超類的混合時,對所有類都使用基類指針。即使從基類指針調用派生類的函數,因爲您聲明瞭需要虛函數的函數,C++將根據指針指向的對象的類型來確定要調用的函數版本。該確定是在運行時進行的,因此您甚至不必擔心指針指向層次結構中的哪個對象。

本頁面涵蓋虛擬功能:http://en.wikipedia.org/wiki/Virtual_inheritance

希望這是你想要的東西。

編輯:

根據此頁:

How do you find all subclasses of a given class in Java?

沒有巧妙的方法,你必須看看在類路徑中的每個類。

+0

那麼,我正在使用Java,它與C++有很多相似之處。我爲我的解決方案版本使用了繼承,它非常優雅,但並不總是可用。我想我可能沒有把這個問題說得很好。這個問題比任何東西都更具假設性,我對可從外部查看層次結構的邏輯算法感興趣(只能訪問函數getImmediateSubGov(),該函數僅返回直接位於關聯對象下方的政府,而不是,它是子博客的子博客。)這是爲了給我一個我不能改變的API的情況。 – Kammeot

+0

@InspiredOne啊我明白了。我編輯了我的答案。 – Joohwan