gpt4 book ai didi

f# - 继承 F# 记录

转载 作者:行者123 更新时间:2023-12-04 13:02:17 25 4
gpt4 key购买 nike

我的理解是 F# 记录是非密封类。如果是这样,我可以继承记录类型吗?例如:

type person = {name:string; address:string}
type employee inherit person = {employeeId: string}

我搜索了 MSDN 文档和语言规范,但我没有任何运气。
提前致谢

最佳答案

F# 记录不能被继承 - 正如 Matthew 所提到的,它们被编译为密封类,但这也是 F# 类型系统的一个方面,它根本不允许这样做。

在实践中,您可以使用普通的类声明。这意味着您将无法使用 { person with ... }语法,你不会得到自动的结构相等,但如果你想创建 C# 友好的代码,它可能是有意义的:

type Person(name:string) =
member x.Name = name

type Employee(name:string, id:int) =
inherit Person(name)
member x.ID = id

我认为首选的选择是使用组合而不是继承,并使员工成为由一些个人信息和 ID 组成的记录:
type PersonalInformation = { Name : string }

type Employee =
{ Person : PersonalInformation
ID : int }

我可能不会让一个人成为员工的一部分(我觉得这不对,但这只是一种直觉),这就是为什么我将它重命名为 PersonalInformation这里。

我想另一种选择是拥有 IPerson作为接口(interface)并有记录 Employee实现接口(interface):
type IPerson = 
abstract Name : string

type Employee =
{ ID : int
Name : string }
interface IPerson with
member x.Name = x.Name

哪个是最好的实际上取决于您要建模的具体事物。但我认为 F# 中通常首选接口(interface)和组合 :-)

关于f# - 继承 F# 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27252276/

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