关于继承:.NET抽象类

.NET abstract classes

我正在设计一个网站导航层次结构。这是一棵节点树。

大多数节点是页面。某些节点是链接(在Windows中请考虑快捷方式)。

大多数页面包含HTML内容。一些执行代码。

我想以这些类和抽象(MustInherit)类的集合表示这些

class diagram

这是我要存储所有这些的数据库表

数据库表http://img178.imageshack.us/img178/8573/nodetablefm8.webp

这就是我感到难过的地方。 PageNodes可以是根,也可以不是根。

我应该如何处理根类?

class diagram

我不想拥有全部四个

  • HtmlPageNode
  • CodePageNode
  • HtmlRootPageNode
  • CodeRootPageNode

我希望HtmlPageNode和CodePageNode类继承自PageNode或RootPageNode。那可能吗?

说明:有多个根节点,并且根可能有父节点。每个仅是具有不同样式的子树的根。考虑不同的颜色编码部门。 (也许root是一个糟糕的名字选择。建议?)

更新:关于"根"名称...
我问:对应于子树的节点是否有特定名称?


如上所述,复合图案可能是一个很好的解决方案。

如果那对您不起作用,则将"根"定义为接口,然后根据需要应用它可能会更简单(如果适用)。

当然,这不能让您提供任何针对Root的实现...
如果根必须具有实现,则可以使用装饰器模式。


使用复合图案。

关于您的根节点,功能上是否存在差异,还是外观完全不同?如果只是外观上的差异,建议您与PageNode中的单独Style类关联。

如果功能上存在差异,并且您有许多类型的页面,请考虑使用装饰器模式。


Clarification: There are multiple root nodes and roots may have parent nodes. Each is the root of only a sub-tree that has distinct styling. Think of different, color-coded departments. (Perhaps root is a poor name choice. Suggestions?)

根是一个较差的名称选择,因为(有点讽刺意味地)将根明确地接受为树结构的顶层,因为树始于根出地面的位置。除此之外的任何节点都是分支或叶,并且不直接连接到根。

更好的名称应该是IsAuthoritativeStyleNode,IsCascadingStyleNode,IsStyleParentNode之类的名称,或者取而代之的是: IsDepartmentRootNode。给事物明确的明确名称是极大提高可读性/易于理解的事情之一。

仅通过抽象基类/继承就无法真正实现所需的功能。根据其他建议,请考虑使用接口。

我还要考虑是否让数据库架构过多地驱动客户端类设计。在这种情况下,不必说需要更改,但至少应该考虑一下。考虑一下如何将属性分解到引用公共"节点"表的单独表中,并对它们进行规范化以最小化空值和/或重复的相同数据。


I want the HtmlPageNode and CodePageNode classes to inherit either from PageNode or else from RootPageNode. Is that possible?

是的,有可能。您需要使HtmlPageNode和codePageNode具有一个对象,该对象将是PageNode将继承的Abstract类,并且也是RootPageNode。在HtmlPageNode和codePageNode的构造函数中,您接受新的Abstract类,在您的情况下将是PageNode或RootPageNode。这样,您将拥有两个具有相同方法但具有两个对象对象的不同类。希望对您有所帮助!


实际上,由于"根"节点是节点的特例,因此可能需要RootHtmlPageNode:HtmlPageNode。

另一个想法:由于您没有指定"根"节点和普通节点之间的区别,因此,也许只需在节点中指定一个标志来指定它是否是根节点,这也是一个很好的设计。

编辑:根据您的说明,普通节点与根节点之间没有功能上的区别,因此,一个简单的标志就足够了(或属性IsRootNode)。如果"根"节点仅提供样式数据(或其本身及其子级的任何其他数据),则可以将此样式数据放置在单独的结构/类中并递归获取(基于IsRootNode):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Node
{
   private bool isRootNode;
   public bool IsRootNode;

   private StylingData stylingData;
   public StylingData StylingData
   {
      set
      {
         if (this.IsRootNode)
            this.stylingData = value;
         else
            throw new ApplicationException("The node is not root.");
      }
      get
      {
         if (this.IsRootNode)
            return this.stylingData;
         else
            return this.parent.StylingData;
      }
   }
}

假设每个节点都有对其父节点的引用。

由于我不知道确切的设计,它已成为无法解决的问题。


PageNode类是否应该仅具有Root类型的属性?

alt text

这与PageNode是-Root的想法背道而驰。或者,它们是否不是"是根",因为只有其中一部分是根?

这是否意味着该属性可能会遍历树以寻找根祖先?还是那只是我?


推荐阅读

    linux硬链接删除命令?

    linux硬链接删除命令?,数据,系统,不了,时间,名称,链接,文件,档案,地方,设备,l

    linux常用链接命令?

    linux常用链接命令?,系统,工作,地址,网络,信息,命令,密码,管理,标准,服务,在L

    linux链接网络命令行?

    linux链接网络命令行?,地址,系统,网络,工作,软件,工具,信息,密码,服务,标准,l

    linux命令下载链接?

    linux命令下载链接?,软件,名称,系统,工具,网络,官网,代理,命令,平台,位置,lin

    linux系统软链接命令?

    linux系统软链接命令?,位置,系统,链接,文件,服务,地址,标准,交通,异常,软件,

    linux进入节点命令?

    linux进入节点命令?,设备,地址,系统,信息,工作,工具,网络,资料,代码,文件,登

    linux创建硬链接命令?

    linux创建硬链接命令?,数据,系统,链接,地方,信息,文件,概念,时间,位置,工作,L

    linux文件链接命令?

    linux文件链接命令?,系统,工作,地址,命令,网络,信息,工具,基础,管理,目录,lin

    linux重新链接库命令?

    linux重新链接库命令?,代码,软件,平台,产品,电脑,系统,入口,市场,工业,通信,l

    linux链接远程命令?

    linux链接远程命令?,系统,地址,网络,密码,软件,名称,工具,服务,电脑,认证,如

    linux命令行链接网络?

    linux命令行链接网络?,网络,系统,地址,工作,工具,最新,网址,数据,信息,环境,l

    linux动态链接库命令?

    linux动态链接库命令?,代码,项目,工程,电脑,网上,文件,程序,静态,命令,目录,

    linux取消链接命令行?

    linux取消链接命令行?,工具,状态,环境,数据,命令,文件,终端,模式,指令,界面,l

    linux删除硬链接命令?

    linux删除硬链接命令?,工作,数据,系统,信息,链接,命令,设备,名称,不了,概念,l

    linux创建软链接命令?

    linux创建软链接命令?,工作,地址,位置,系统,信息,管理,服务,名字,链接,文件,

    linux中软链接命令?

    linux中软链接命令?,位置,设备,数据,信息,系统,文件,链接,地址,对比,源文件,L

    linux命令链接网页?

    linux命令链接网页?,网络,信息,系统,网址,工具,网站,状态,发行,数据,命令,Lin

    linux软链接命令用法?

    linux软链接命令用法?,时间,系统,位置,服务,链接,数据,地址,基础,不了,信息,L

    linux创建节点命令?

    linux创建节点命令?,设备,系统,信息,软件,试点,电脑,节点,香港,官方网站,官

    linux目录链接命令?

    linux目录链接命令?,系统,工作,时间,地址,数据,信息,管理,目录,文件,命令,请