如何从 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 签名文件中的抽象类继承?的主要内容,如果未能解决你的问题,请参考以下文章