gpt4 book ai didi

interface - F# 将对象强制转换为接口(interface)

转载 作者:行者123 更新时间:2023-12-03 08:20:14 26 4
gpt4 key购买 nike

我有一个名为“ Pane ”(想想玻璃 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
...

我创建了一个 Pane 列表( Pane 列表):
let p = [ p1; p2 ]

但是我需要将其转换为 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'

当 Pane 实现 IPane 时,这很令人困惑。简单地将 Pane 列表对象作为参数传递给所需的函数也会产生错误。

如何将 Pane 列表转换到 IPane 列表?

最佳答案

F# 不允许以您想要的方式进行继承。

更好的方法是使用:

[p1 ;p2] |> List.map (fun x -> x:> IPane)

或者,您可以更改您的功能以使用类似的东西
let f (t:#IPane list) = ()

在这里你可以做 f [p1;p2]作为 #告诉编译器任何继承自 IPane 的类型很好。

关于interface - F# 将对象强制转换为接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24055546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com