gpt4 book ai didi

.net - 以函数式方法解决继承依赖

转载 作者:行者123 更新时间:2023-12-05 00:54:11 25 4
gpt4 key购买 nike

The problem :

Inheritance dependency

  • Type A stores a value of type B in a property

  • Type B inherits from type A

We'll consider a UI control hierarchy, where every control belongs to a top-level "Form", and the Form itself is a 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)

但是我如何才能以函数式方法进行重新设计:“我们根本不会使用继承。相反,我们会结合使用组合和参数化”?

最佳答案

这个问题很难回答,因为问题的表述本质上是面向对象的。当您说“表单是一个控件”时,问题的“是一个”部分暗示了您通常不会在函数式编程中使用的 OO 建模世界的方式。

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

type SimpleControl = 
| Button of string
| Label of string

type ContainerControl =
| Form

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

这让您可以定义可以包含其他控件和按钮和标签的容器控件(例如表单),这些控件是简单的控件,不能包含其他元素。但这只是一个示例 - 根据您实际想要构建的用户界面类型以及您想要对它们执行的操作,您将以不同方式定义类型。

简而言之,函数式编程通常需要不同的思维方式,并且一些在面向对象的世界中有意义的问题在函数式世界中没有意义。

关于.net - 以函数式方法解决继承依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43752551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com