F#将对象转换为接口

Nic*_*ick 6 f# interface

我有一个名为'Pane'的课程(想想玻璃窗格),它实现了IPane:

type IPane =
    abstract PaneNumber : int with get, set
    abstract Thickness : float<m> with get, set
    abstract ComponentNumber : int with get, set
    abstract Spectra : IGlassDataValues with get, set
    ...

type Pane(paneNumber, componentNumber, spectra, ...) =
    let mutable p = paneNumber
    let mutable n = componentNumber
    let mutable s = spectra
    ...

    interface IPane with
        member this.PaneNumber
            with get() = p
            and set(value) = p <- value
        member this.ComponentNumber
            with get() = n
            and set(value) = n <- value
        member this.Spectra
            with get() = s
            and set(value) = s <- value
            ...
Run Code Online (Sandbox Code Playgroud)

我创建了一个窗格列表(窗格列表):

let p = [ p1; p2 ]
Run Code Online (Sandbox Code Playgroud)

但是我需要将它转换为IPane列表,因为这是另一个函数中的参数类型.以下代码生成错误:

let p = [ p1; p2 ] :> IPane list
'Type constraint mismatch. The type
  Pane list
is not compatible with type
  IPane list
The type 'IPane' does not match the type 'Pane'
Run Code Online (Sandbox Code Playgroud)

当Pane实现IPane时,这很令人困惑.只需将Pane list对象作为参数传递给所需的函数也会产生错误.

如何将窗格列表转换为IPane列表?

Joh*_*mer 8

F#不允许以你想要的方式继承.

更好的方法是使用:

[p1 ;p2] |> List.map (fun x -> x:> IPane)
Run Code Online (Sandbox Code Playgroud)

或者,您可以将功能更改为使用此类功能

let f (t:#IPane list) = ()
Run Code Online (Sandbox Code Playgroud)

在这里你可以做f [p1;p2]#告诉编译器,从继承的任何类型IPane的罚款.