继承F#记录

时间:2014-12-02 14:51:59

标签: f#

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

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

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

2 个答案:

答案 0 :(得分:21)

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作为接口并使用记录 Employee来实现接口:

type IPerson = 
  abstract Name : string

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

哪一个最好真的取决于你正在建模的具体事情。但我认为F#中通常首选接口和组合: - )

答案 1 :(得分:8)

它们是密封类,这是为person生成的类的前几行:

[CompilationMapping(SourceConstructFlags.RecordType)]
[Serializable]
public sealed class person 
: IEquatable<person>, 
  IStructuralEquatable, 
  IComparable<person>, 
  IComparable, 
  IStructuralComparable