Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET抽象类_.net_Inheritance_Abstract Class - Fatal编程技术网

.NET抽象类

.NET抽象类,.net,inheritance,abstract-class,.net,Inheritance,Abstract Class,我正在设计一个网站导航层次结构。这是一个节点树 大多数节点都是页面。有些节点是链接(想想Windows中的快捷方式) 大多数页面都包含HTML内容。有些人执行代码 我想将这些表示为类和抽象(MustInherit)类的集合 这是数据库表,我将在其中存储所有这些 这就是我被难倒的地方。页面节点可以是根,也可以不是根 我应该如何处理根类 我不想把这四个 HTMLPGENODE 代码页节点 HtmlRootPageNode 代码根节点页面节点 我希望HtmlPageNode和CodePage

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

大多数节点都是页面。有些节点是链接(想想Windows中的快捷方式)

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

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

这是数据库表,我将在其中存储所有这些

这就是我被难倒的地方。页面节点可以是根,也可以不是根

我应该如何处理根类

我不想把这四个

  • HTMLPGENODE
  • 代码页节点
  • HtmlRootPageNode
  • 代码根节点页面节点
我希望HtmlPageNode和CodePageNode类可以从PageNode继承,也可以从RootPageNode继承。可能吗


澄清:有多个根节点,根节点可能有父节点。每个都只是具有不同样式的子树的根。想想不同的、有颜色编码的部门。(也许根是一个糟糕的名字选择。建议?)


更新:关于“根”名称…
我问过:

实际上,由于“root”节点是node的一个特例,可能您需要RootHtmlPageNode:HtmlPageNode

另一个想法是:由于您没有指定“根”节点和普通节点之间的区别,因此在节点中仅使用一个标志来指定它是否为根也是一个好的设计

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

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

这已经远远超出了问题的范围,因为我不知道确切的设计。

使用


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

如果在功能上存在差异,并且您有很多类型的页面,那么请考虑使用

我希望HtmlPageNode和CodePageNode类可以从PageNode继承,也可以从RootPageNode继承。可能吗


是的,这是可能的。您需要让HtmlPageNode和codePageNode拥有一个对象,该对象将是PageNode将继承的抽象类,而RootPageNode也是。在HtmlPageNode和codePageNode的构造函数中,您接受新的抽象类,它将在您的案例PageNode或RootPageNode中出现。这样,您就有了两个不同的类,它们具有相同的方法,但有两个不同的对象。希望对你有帮助

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

这与PageNode根的想法相反。或者,它们不是“是根”吗,因为它们中只有一些是根


这是否意味着该属性可能遍历树以查找根祖先?或者这只是我的问题?

如前所述,复合模式可能是一个很好的解决方案

如果这对您不起作用,那么将Root定义为接口并根据需要应用它可能会更简单(如果合适的话)

当然,这不允许您为Root提供任何实现…
如果Root必须有实现,那么可以使用Decorator模式

澄清:有多个根节点,根节点可能有父节点。每个都只是具有不同样式的子树的根。想想不同的、有颜色编码的部门。(也许根是一个糟糕的名字选择。建议?)

根是一个糟糕的名称选择,因为它(有点讽刺意味)被明确地认为是树结构的顶层,因为树从根出地面的地方开始。超出该范围的任何节点都是分支或叶,且不直接连接到根

更好的名称应该是类似IsAuthoritativeStyleNode、IsCascadingStyleNode、IsStyleParentNode的名称,或者对其进行限定:例如IsDepartmentRootNode。给事物起一个清晰明确的名字是一件能极大地提高可读性/易懂性的事情

仅仅通过抽象基类/继承不能真正实现您想要的。根据其他建议,请考虑接口。
<>我也会考虑你是否让数据库模式太过驱动你的客户端类设计。并不是说在这种情况下它需要改变,但至少应该考虑一下。考虑如何将属性分解到引用公共“节点”表的单独表中,并对它们进行规范化,以最小化空值和/或重复的相同数据

我需要澄清。请看我的答案。我仍在努力专注于最终的架构。最初,我使用了许多几乎没有空字段的小表。我还了解了LINQ to SQL IsDiscriminator属性。但后来我了解到LINQtoSQL只支持单表继承。不要在is-a或has-a讨论上太过纠结。。。如果他们中的一个不能自动“感觉”正确,那就没关系了,只要按照有效的方法去做就行了。
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;
      }
   }
}