2010-10-17 53 views
2

我有一個問題,數據以樹的形式表示(例如:二叉樹)。樹具有不同種類的節點。所以基本上,有一個基類,然後從它派生不同的節點。Objective C(iOS)設計問題

此數據還需要在屏幕上呈現給用戶,這涉及每個節點的自定義繪圖。節點如何繪製取決於節點的類型。樹還涉及簡化過程,使用該過程基於一些規則導出原始樹的新簡化形式。

爲了繪製這些節點,我需要保持位置和大小。我想知道如何將此代碼與用於簡化的節點中的其他數據繪製在屏幕上所需的數據分開。

我希望這個問題有道理。感謝您的幫助和時間。

回答

0

「保持位置和大小」的含義並不那麼明確。

如果您的意思是給定一個屬於樹(T)的節點N,它具有相同的父代和相同的子代,那麼您將澄清我們是否應用T來獲取簡化的(T1)結果是不同的樹或同態樹。

我不太清楚目標C,但是你問我們的問題似乎對於每一種OOP語言都是一般的。

假設N是在樹T中使用的節點,您可以在基類N中聲明內部類「NData」。因此,每個節點派生類都將具有要在簡化過程中使用的NData數據。

我希望我能理解這個問題:-)

+0

爲了繪製節點,我們需要知道它的位置,高度和寬度,這是動態計算的。樹T將被簡化爲一棵新的樹T1。所以基本上,在節點類中我們需要維護兩種類型的數據。將用於表示屏幕上節點的數據以及將用於將樹T轉換爲T1的數據。我的問題是這兩個數據可以在同一個類中(Node),還是有更好的設計來分離它們? – Mithin 2010-10-18 04:23:58

+0

在設計的角度下,我認爲最好將它們分開。如果「Node」是類名,我會在Node類中放入一個名爲「NodeData」的內部類。因此,您可以有效分離數據並將「NodeData」鏈接到「Node」類。如果我記得它應該是UML設計語言中的「組合模式」。 – robob 2010-10-18 06:00:00

+0

我希望評論對你有用...... – robob 2010-10-19 05:27:03

1

一種方法是爲表示您的樹節點的視圖創建1:1類層次結構。也就是說,每個樹節點類都有自己的UIView子類,它知道如何繪製具體的樹節點類。 UIViews(和CALayers)已經擁有所有必要的接口來維護大小,位置和層次。這種方法的一個可能的缺點是,如果你有一個巨大的樹節點類層次結構(非常多的不同類節點),你將擁有大量的視圖類,這對代碼和支持可能會變得有點乏味。嘗試將大多數常用繪圖功能提取到樹節點視圖超類中,並通過對不同樹節點重用視圖類(當然,如果它有意義的話)來幫助簡化節點視圖類層次結構。

另一種方法是添加一些佈局/繪圖方法來以協議的形式對類進行建模。因此,您的樹節點知道如何繪製自己,單個樹節點視圖類調用這些繪圖方法並維護大小/位置。

在這兩種情況下,節點視圖類都具有引用節點模型的實例變量,並且可以訪問繪製/佈局節點所需的節點屬性。