Aren';除了使用层次结构之外,没有其他更好的显示对象的方法了

本文关键字:其他 更好 方法 显示 对象 Aren 层次结构 | 更新日期: 2023-09-27 17:48:51

我有一个这样的类层次结构:

        +-- VirtualNode
        |
INode --+                  +-- SiteNode
        |                  |
        +-- AbstractNode --+
                           |
                           +-- SiteSubNode

以及建立在CCD_ 2上的相应的CCD_ 1类。为了显示NodeCollection,我需要知道每个成员的最终类型。所以我需要一个类似的功能

foreach (INode n in myNodeCollection)
{
    switch(n.GetType())
    {
        case(typeof(SiteNode)):
        // Display n as SiteNode
    }
}

现在,这真的不是一种面向对象的方法。在你看来,有什么模式或推荐的方法可以做同样的事情吗

编辑
我已经考虑过在INode接口中添加DisplayRender方法。这会产生将视图与模型耦合的副作用,我非常希望避免这种情况。

Aren';除了使用层次结构之外,没有其他更好的显示对象的方法了

我想你想要的是访问者模式。

多态性:

当您有一个使用对象类型的select语句时,它是重构多态性的主要候选语句。

看看马丁·福勒的《重构》一书:

"面向对象代码最明显的症状之一是它相对缺乏切换(或者case)语句。switch语句的问题本质上是重复问题。你经常在不同的地方找到分散在程序中的相同switch语句。如果添加新子句到switch,您必须找到所有这些switch、语句并对其进行更改。面向对象多态性的概念为您提供了一种处理这个问题的优雅方法。

大多数情况下,看到switch语句时,应该考虑多态性。问题在于多态性应该发生。switch语句通常在类型代码上切换。你想要承载类型代码值的方法或类。所以使用提取方法提取开关语句,然后移动方法将其放到需要多态性的类中。在在这一点上,您必须决定是用子类替换类型代码还是替换键入带有状态/策略的代码。设置继承结构后,可以使用用多态性替换条件性。"

以下是一种在您的情况下使用多态性的方法:

  1. 在中定义抽象方法AbstractNode命名为显示()。

  2. 然后在中实际实现Display()每个SiteNode和SiteSubNode类。

  3. 然后,当您需要显示这些节点,您可以简单地迭代通过包含AbstractNode和调用类型的项每个的Display()。

  4. 对Display()的调用将自动解析为实际真实的具体实施该项目的类型。

  5. 注意:您也可以移动AbstractNode中的Display()方法如果将显示VirtualNode。

如果可以更改INode接口,请添加一个返回"视图"的虚拟方法,并在继承的类中覆盖它。

如果不能更改基本接口,请为每个类实现扩展方法,并让它们为每个特定类返回的"视图"。