2008-11-20 128 views
3

我有以下對象模型:訪問父元素有效

 
- Book 
-- Chapter 1 
--- Page 1 
---- Image 1 
---- Image 2 
---- Text 1 
--- Page 2 
... 

資源是一路下滑在頁面級別。但是,從資源的角度來看,我需要知道資源的完整路徑。

一種方法是讓資源知道他們的父母。

所以我的Image對象可以有一個「parentPage」屬性,而這個屬性又可以有一個「parentChapter」屬性。這樣,我可以通過currentImage.parentPage.parentChapter訪問完整路徑。有沒有更好的辦法?

有兩個關於爲什麼我需要從資源的角度來了解完整路徑的文字。我有一個對象模型,可以在屏幕上散步和渲染。渲染器從章節級下降到元素/資源級(這是渲染髮生的地方)。但是爲了顯示資源,我需要知道他們住在哪裏(例如磁盤上的實際路徑),這些信息通常在章節級別指定。

謝謝!

- 編輯 - 只是爲了澄清,這是parent.parent方法最好?它強迫兒童對象瞭解父母,這讓我感到不舒服。耦合?

回答

2

無論你是否使用扎卡里的樹狀結構,或者你更型做具體的方式,關於耦合生命的問題。

如果有很多圖片與圖片在頁面中的「託管」方式無關,您可能需要使用具有上下文相關方面的中間類型,其中包含一個圖像實例(參考)。

只有您可以決定是否過分,這取決於應用程序以及減少耦合的重要性,並允許在其他環境中更多地重用某些組成成分。

6

我會建議一個樹結構,而你的每個類繼承自一個樹節點。

實例在C#:

class TreeNode { 
public TreeNode Parent { get; set; } 
public List<TreeNode> Children { get; set; } 
} 

class Book : TreeNode { 
... book attributes ... 
} 

... other classes ... 

其實,如果你擔心耦合的事情要問自己是好耦合或壞的耦合?如果耦合實際上增加了價值,並且有合理的理由去做,那就做吧。如果沒有,這是浪費的代碼。如果您使用的是支持泛型的語言,則可以將它分離得更遠:

class TreeNode<TParent, TChild> 
{ 
    public TParent Parent { get; set; } 
    public List<TChild> Children { get; set; } 
} 

class Book : TreeNode<object, Chapter> { } 
class Chapter : TreeNode<Book, Page> { } 
class Page : TreeNode<Chapter, object> { } 

希望對您有所幫助!

0

您可能能夠將對象序列化爲xml,並使用linq to xml來解析信息。

如果必須使用對象的情況下,另一種選擇可能是看的複合模式(see wikipedia

埃裏克