在函数方法中解决继承依赖性

时间:2017-05-03 06:23:42

标签: .net oop inheritance f# functional-programming

The problem

  

继承依赖

     
      
  • 类型A在属性

  • 中存储类型B的值   
  • B类继承自A类

  •   
     

我们将考虑一个UI控件层次结构,其中每个控件都属于顶级" Form",而Form本身就是一个Control。

作者通过参数化类来解决这个问题:

[<AbstractClass>]
type Control<'Form>(name) = 
    member this.Name = name

    abstract Form : 'Form

type Form(name) = 
    inherit Control<Form>(name)

    override this.Form = this

type Button(name,form) = 
    inherit Control<Form>(name)

    override this.Form = form

let form = new Form("form")       
let button = new Button("button",form)

但是我如何在功能方法中重新设计:&#34;我们根​​本不会使用继承。相反,我们会将组合与参数化结合使用&#34;?

1 个答案:

答案 0 :(得分:7)

这个问题很难回答,因为问题的提法本质上是面向对象的。当你说&#34; form是一个控件&#34;时,&#34;是&#34;问题的一部分暗示了一种OO的建模世界的方式,你通常不会在函数式编程中使用它。

严格来说,您的示例代码实际上并没有做任何有用的事情 - 它会创建一堆对象,但不会使用它们来呈现任何用户界面或实现任何其他功能。
当然,我怀疑这就是问题所在。如果我想建模一个包含表单和按钮的非常简单的用户界面,我可能会从这样的东西开始:

type SimpleControl = 
  | Button of string
  | Label of string

type ContainerControl = 
  | Form 

type Control = 
  | Container of ContainerControl * Control list
  | Simple of SimpleControl

这允许您定义容器控件(例如表单),它可以包含其他控件,按钮和标签,这些控件和按钮和标签是简单的控件,不能包含其他元素。这只是一个例子 - 根据您实际想要构建的用户界面类型以及您想要用它们做什么,您可以不同地定义类型。

简短的版本是,函数式编程通常需要不同的思维方式,而在面向对象世界中有意义的一些问题在功能世界中没有意义。