Inheritance 使用具有派生类型(F#)参数的函数

Inheritance 使用具有派生类型(F#)参数的函数,inheritance,casting,f#,code-reuse,upcasting,Inheritance,Casting,F#,Code Reuse,Upcasting,我的应用程序中有一个类-为了简单起见,假设它的定义如下: type baseType() = member this.A = 5. 还有,我有很多函数,它们将这种类型的对象作为参数。此外,其中一些采用这种类型的数组: let myFun (xArr : baseType[]) = // ... do something inspirig ;) 现在我意识到,如果有另一个从“baseType”派生的类就好了。e、 g: 但是,我不能将继承类型的数组与“myFun”之类的函数一起

我的应用程序中有一个类-为了简单起见,假设它的定义如下:

type baseType() =
    member this.A = 5.
还有,我有很多函数,它们将这种类型的对象作为参数。此外,其中一些采用这种类型的数组:

let myFun (xArr : baseType[]) =
    // ... do something inspirig ;)
现在我意识到,如果有另一个从“baseType”派生的类就好了。e、 g:

但是,我不能将继承类型的数组与“myFun”之类的函数一起使用

这将是“很高兴拥有”。有没有一种简单的方法可以在不应用太多更改的情况下重新使用我的函数


我想解决方案之一是使用函数(fun(d:inhType)->d:>baseType)映射我的数组,但我想知道是否还可以做其他事情。

您需要将函数注释为接受一个


您还可以使用类型注释,用子类型
B
的实例填充
A
数组:

let bArr: A[] = [| B() |]

这对于一次性使用或函数位于第三方库中时非常有用。另一种常见用法是创建装箱数组(
obj[]
)。

True,但请注意,这仅适用于数组文本。类似于
让bArr:A[]=Array.create 1(B())
的东西将无法工作。
let baseArr = [| baseType() |]
let inhArr = [| inhType() |]

myFun baseArr
myFun inhArr // won't work
type A() = class end
type B() = inherit A()

let aArr = [| A() |]
let bArr = [| B() |]

// put # before type to indicate it's a flexible type
let f (x : #A[]) = ()

f aArr
f bArr  // works!
let bArr: A[] = [| B() |]