如何使Abstract类继承F#中的接口?

时间:2018-10-29 09:48:50

标签: 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

我想在此实现层次结构 Node hierarchy class diagram,但编译器抱怨接口的所有方法都应实现。

创建一个抽象类的正确方法是什么,该抽象类实现一个接口并实现该接口的一个方法而使其他方法抽象化?

注意:如果看不到图像,则说明您的网络阻止了imgur.com。

1 个答案:

答案 0 :(得分:5)

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

[<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来引用抽象类型)