Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 返回F中的派生类#_Inheritance_F# - Fatal编程技术网

Inheritance 返回F中的派生类#

Inheritance 返回F中的派生类#,inheritance,f#,Inheritance,F#,考虑下面的代码,它声明了一个名为shape的抽象基类和另一个名为square的类,该类继承自shape: open System [<AbstractClass>] type shape() = abstract area : int type square(side) = inherit shape() override this.area = side * side let return_square(n): shape = new squa

考虑下面的代码,它声明了一个名为
shape
的抽象基类和另一个名为
square
的类,该类继承自
shape

open System

[<AbstractClass>]
type shape() =
    abstract area : int

type square(side) =
    inherit shape()
    override this.area = side * side

let return_square(n): shape =
    new square(n)

[<EntryPoint>]
let main argv =
    let foo = new square (3)
    printfn "%d" foo.area

    let bar = return_square(4)
    printfn "%d" bar.area
    0 // Return 0 to OS
谁能解释一下我做错了什么?我不应该返回一个
正方形
,因为它是一种
形状


许多TIA

fsharp编译器不会自动为您执行从
square
shape
的转换

例如,您可以通过将代码更改为:

let return_square(n):形状=
新正方形(n):>形状
或者您甚至不必指定类型:

let return_square(n):形状=
新广场(n):>_
另一种选择是从类型签名中省略类型,只执行强制转换:

let return_square(n)=
新正方形(n):>形状
此外,调用构造函数时,实际上不需要括号和
new
关键字,因此您也可以将其简化为:

let return_square n =
    square n :> shape

fsharp编译器不会自动为您执行从
square
shape
的转换

例如,您可以通过将代码更改为:

let return_square(n):形状=
新正方形(n):>形状
或者您甚至不必指定类型:

let return_square(n):形状=
新广场(n):>_
另一种选择是从类型签名中省略类型,只执行强制转换:

let return_square(n)=
新正方形(n):>形状
此外,调用构造函数时,实际上不需要括号和
new
关键字,因此您也可以将其简化为:

let return_square n =
    square n :> shape