首页 > 解决方案 > 如何在 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。

标签: f#

解决方案


您可以在类型上定义抽象成员,然后提供指向这些抽象成员的实现。例如:

[<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


推荐阅读