继承依赖
- 中存储类型B的值
类型A在属性
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;?
答案 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
这允许您定义容器控件(例如表单),它可以包含其他控件,按钮和标签,这些控件和按钮和标签是简单的控件,不能包含其他元素。这只是一个例子 - 根据您实际想要构建的用户界面类型以及您想要用它们做什么,您可以不同地定义类型。
简短的版本是,函数式编程通常需要不同的思维方式,而在面向对象世界中有意义的一些问题在功能世界中没有意义。