有没有办法让记录在F#中继承一个抽象类?

时间:2014-03-19 20:59:21

标签: f#

我们说我有一个界面IEvent。这个接口有一个Id属性,我用C#实现了它:

public abstract class EventBase : IEvent
{
    public Guid Id { get; protected set; }
]

有没有办法在F#记录中继承这个抽象类?

类似的东西:

type OneOfMyEvents = {Id: Guid, Prop: string}
    inherit EventBase(Id)

问题是我想将我的所有事件定义为记录,因为它非常方便,但我也想强制我的所有事件都有一个我不必每次都输入的Id属性。

3 个答案:

答案 0 :(得分:7)

记录不能从类继承,但它们可以实现接口。例如,使用您的IEvent界面:

open System

[<Interface>]
type IEvent =
    abstract Id : Guid with get


type MyRecord = {
    Id: Guid;
    Prop: string;
} with
    interface IEvent with
        member this.Id
            with get () = this.Id

答案 1 :(得分:5)

没有

no syntax用于指定从任何内容继承的记录。

f#中的记录类型与类类型不同。从类到记录的继承是没有意义的:记录具有结构相等语义,而类(通常)具有引用相等语义。因此,继承可能意味着从前者转移到后者,因为一个人继承了继承层次结构,违反了我们对子类和超类(记录?)之间关系的期望。

答案 2 :(得分:3)

根据the documentation,记录可以这样定义:

[ attributes ]
type [accessibility-modifier] typename = { 
    [ mutable ] label1 : type1;
    [ mutable ] label2 : type2;
    ...
    }
    member-list

虽然您可以向其添加属性和成员,但您无法从基类派生它。


  

强制我的所有事件都有一个我不必每次都输入的Id属性

好的,但是,什么更容易输入?

Id: Guid

inherit EventBase(Id)

在这种情况下,记录语法实际上更简洁。