如何从 fsharp 签名文件中的抽象类继承?

Posted

技术标签:

【中文标题】如何从 fsharp 签名文件中的抽象类继承?【英文标题】:How to inherit from an abstract class in an fsharp signature file? 【发布时间】:2015-11-14 21:06:32 【问题描述】:

我正在尝试在 FSharp 中为域建模。我希望客户端代码能够体验对这些类型的干净访问。因此,其中一部分是通过创建签名文件 (.fsi),如下所述:https://msdn.microsoft.com/en-us/library/dd233196.aspx

Microsoft 页面没有描述继承如何在 FSharp 签名文件中工作。我确实在这里发现了如何使用“interface”关键字指示接口实现:https://github.com/intellifactory/websharper.ui.next/blob/master/WebSharper.UI.Next/Attr.fsi

很好。但我想更进一步,从一个抽象类继承,并在签名文件中指出这一点。

目标是多态性。在某个地方,我想要一个函数将参数“v”作为:(v : S list),其中 S 是超类型,列表可能包含其子类型的值。

但是从抽象类继承的 fsharp 签名文件中的语法是什么?

在“Artefact.fs”中我有(是的,它是一个 Websharper 项目):

[<javascript; AbstractClass>]
type Artefact() =
    abstract member Visual : Doc with get

在“Visual.fsi”中我有:

[<JavaScript; Sealed>]
type Visual = 
    inherit Artefact

“继承”行无法编译。那么正确的语法是什么?

我尝试了这些(也不起作用):

1) Artefact 后面的括号

[<JavaScript; Sealed>]
type Visual = 
    inherit Artefact()

2) Visual 后面的括号

[<JavaScript; Sealed>]
type Visual() = 
    inherit Artefact

有什么想法吗?

【问题讨论】:

解决此类问题的最简单方法 - 编写实现文件并让编译器生成 fsi 文件。 谢谢约翰,这有帮助。我已经发布了答案。 【参考方案1】:

这是在签名文件中从抽象类继承的正确语法:

[<JavaScript; Sealed>]
type Visual = 
    class
        inherit Artefact
    end

解释(如我所见)。在我在上面的问题中使用的语法中,编译器不理解类型是一个类。并非所有类型都可以继承,因此您有编译器的抱怨。

在我在此答案中使用的语法中,我明确声明该类型是一个类。我不知道这个语法,我只见过“类结束”,我从来没有想过你可以在这两个关键字之间添加东西。

感谢上面的回复。如果您不知道语法,则自动生成 .fsi 文件。这将为您提供可以自定义和清理的语法。有关自动签名文件生成,请参阅此帖子: Automated F# Signature File (.fsi) Generation

【讨论】:

以上是关于如何从 fsharp 签名文件中的抽象类继承?的主要内容,如果未能解决你的问题,请参考以下文章

第三章:继承/抽象类/接口

接口和抽象类的区别

如何从 XCode 中的 DerivedData 下的模块文件中停止“签名不匹配”错误?

Java 面向对象编程 抽象类 抽象方法 abstract

抽象类和接口的相同点和不同点

派生类中具有相同名称但不同签名的函数