2008-11-20 84 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

埃里克