首页 > 代码库 > 8.4.3 C# 决策树

8.4.3 C# 决策树

8.4.3 C# 决策树

 

在第五章,我们讨论过 F# 的差别联合和 C# 中的类层次结构之间的关系。在此示例中,我们将使用另一个种类层次结构表示决策树的节点,派生两个额外的类来表示两种不同情况(最后结果和查询)。

在函数式版本中,所有的处理逻辑都是在 testClientTree 函数中分别实现的。我们以面向对象的风格,使用访问者模式(visitor pattern)(在第七章讨论过),虽然也能做到这一点,但这并不是正宗的面向对象解决方案。这里,我们不需要实现函数分别处理决策树,所以,可以用更一般的面向对象技术,继承和虚方法。

清单 8.17 显示了基类(Decision)和两个派生类中较简单的一个(ResultDecision),表示最终结果。

 

清单 8.17 面向对象的决策树 (C#)

abstract class Decision { 

  public abstract void Evaluate(Clientclient);     [1]

class ResultDecision : Decision { 

  public bool Result { get; set;} 

  public override void Evaluate(Clientclient) {    [2]

   Console.WriteLine("OFFER A LOAN: {0}", Result ? "YES" :"NO"); 

  } 

}

 

这部分代码相当简单。基类只包含一个虚方法[1],将在派生类中实现,检查客户并输出结果。在表示最终结果的类中的实现[2],输出结果到控制台。

更重要的部分是实现表示查询的类。问题是我们需要为每个具体查询提供不同的代码(检查收入,当前工作年限,等等)。我们可以为每个查询创建一个新的派生类,与 Evaluate 方法的实现类似,但感觉并不是好的解决方案,因为,涉及代码重复。更好的实现方法是使用模板方法(template method)的设计模式。

8.4.3 C# 决策树