我们说我有一个界面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属性。
答案 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)
在这种情况下,记录语法实际上更简洁。