.NET abstract classes我正在设计一个网站导航层次结构。这是一棵节点树。 大多数节点是页面。某些节点是链接(在Windows中请考虑快捷方式)。 大多数页面包含HTML内容。一些执行代码。 我想以这些类和抽象(MustInherit)类的集合表示这些
这是我要存储所有这些的数据库表 数据库表http://img178.imageshack.us/img178/8573/nodetablefm8.webp 这就是我感到难过的地方。 PageNodes可以是根,也可以不是根。 我应该如何处理根类?
我不想拥有全部四个
我希望HtmlPageNode和CodePageNode类继承自PageNode或RootPageNode。那可能吗? 说明:有多个根节点,并且根可能有父节点。每个仅是具有不同样式的子树的根。考虑不同的颜色编码部门。 (也许root是一个糟糕的名字选择。建议?)
更新:关于"根"名称... 如上所述,复合图案可能是一个很好的解决方案。 如果那对您不起作用,则将"根"定义为接口,然后根据需要应用它可能会更简单(如果适用)。
当然,这不能让您提供任何针对Root的实现... 使用复合图案。 关于您的根节点,功能上是否存在差异,还是外观完全不同?如果只是外观上的差异,建议您与PageNode中的单独Style类关联。 如果功能上存在差异,并且您有许多类型的页面,请考虑使用装饰器模式。
根是一个较差的名称选择,因为(有点讽刺意味地)将根明确地接受为树结构的顶层,因为树始于根出地面的位置。除此之外的任何节点都是分支或叶,并且不直接连接到根。 更好的名称应该是IsAuthoritativeStyleNode,IsCascadingStyleNode,IsStyleParentNode之类的名称,或者取而代之的是: IsDepartmentRootNode。给事物明确的明确名称是极大提高可读性/易于理解的事情之一。 仅通过抽象基类/继承就无法真正实现所需的功能。根据其他建议,请考虑使用接口。 我还要考虑是否让数据库架构过多地驱动客户端类设计。在这种情况下,不必说需要更改,但至少应该考虑一下。考虑一下如何将属性分解到引用公共"节点"表的单独表中,并对它们进行规范化以最小化空值和/或重复的相同数据。
是的,有可能。您需要使HtmlPageNode和codePageNode具有一个对象,该对象将是PageNode将继承的Abstract类,并且也是RootPageNode。在HtmlPageNode和codePageNode的构造函数中,您接受新的Abstract类,在您的情况下将是PageNode或RootPageNode。这样,您将拥有两个具有相同方法但具有两个对象对象的不同类。希望对您有所帮助! 实际上,由于"根"节点是节点的特例,因此可能需要RootHtmlPageNode:HtmlPageNode。 另一个想法:由于您没有指定"根"节点和普通节点之间的区别,因此,也许只需在节点中指定一个标志来指定它是否是根节点,这也是一个很好的设计。 编辑:根据您的说明,普通节点与根节点之间没有功能上的区别,因此,一个简单的标志就足够了(或属性IsRootNode)。如果"根"节点仅提供样式数据(或其本身及其子级的任何其他数据),则可以将此样式数据放置在单独的结构/类中并递归获取(基于IsRootNode):
假设每个节点都有对其父节点的引用。 由于我不知道确切的设计,它已成为无法解决的问题。 PageNode类是否应该仅具有Root类型的属性?
这与PageNode是-Root的想法背道而驰。或者,它们是否不是"是根",因为只有其中一部分是根? 这是否意味着该属性可能会遍历树以寻找根祖先?还是那只是我? |