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
谁能解释一下我做错了什么?我不应该返回一个正方形
,因为它是一种形状
许多TIAfsharp编译器不会自动为您执行从
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