f# - 如何在 F# 中创建一个继承接口的抽象类?
问题描述
我有以下带有接口和抽象类的代码。
type INode<'a> =
abstract member Parent:INode<'a>
abstract member Evaluate:unit->'a
abstract member Clone:INode<'a> -> INode<'a>
abstract member SelectRandom:int->INode<'a> option
[<AbstractClass>]
type TerminalNode<'a>() =
interface INode<'a> with
member this.SelectRandom indexOfCurrentNode =
let p = 1.0 / float indexOfCurrentNode
if Random().NextDouble() < p then Some (this:>INode<'a>) else None
我想在此实现层次结构, 但编译器抱怨应该实现接口的所有方法。
创建实现接口并实现该接口的一个方法而其他方法抽象的抽象类的正确方法是什么?
注意:如果您看不到图像,则您的网络正在阻止 imgur.com。
解决方案
您可以在类型上定义抽象成员,然后提供指向这些抽象成员的实现。例如:
[<AbstractClass>]
type TerminalNode<'a>() as self =
abstract member Parent : INode<'a>
abstract member Evaluate : unit->'a
abstract member Clone:INode<'a> -> INode<'a>
interface INode<'a> with
member this.Parent = self.Parent
member this.Evaluate () = self.Evaluate ()
member this.Clone a = self.Clone a
member this.SelectRandom indexOfCurrentNode =
...
(注意行as self
中的type
,它可以让你通过变量名来引用抽象类型self
)
推荐阅读
- mysql - 两个表的 SQL 内连接错误输出
- javascript - HTML 表单 onSubmit 被绕过
- javascript - 使用 JQuery 使用依赖的 JSON 文件动态填充下拉列表
- windows - lua io.popen 运行程序,路径中有空格
- c - 读取,fread 部分读取
- python - 检查文件行是否以字符开头
- bash - 如何调用awk来处理/var/log/wtmp?
- r - 什么 R 对象可以保存变量,以便我可以迭代该对象?
- android - 具有在线数据的最简单的应用程序,(android)
- javascript - Returning an object in an function expression - is null