type PocketMouse = class inherit Mouse
val pocket : string
new (namae,contents) = {inherit Mouse(namae);pocket = contents;}
end;;
let dora = new PocketMouse("doraemon","4jigen pocket");;
let pika = new PocketMouse("pikachu","denki bukuro");;
class inherit mouse的部分为实现继承的部分,利用该表达式声明mouse类的继承。同时,在构造器的初始化的位置,调用父类的构造器,调用时使用inherit关键字。
创建类时,知道父类与子类的构造器的调用顺序是十分有用的。接下来的例子中,确认构造器的调用顺序。
构造器的调用顺序
type Mouse = class
val name : string
new (n) = {name = n} then System.Console.WriteLine("base class constructor called")
end;;
type PocketMouse = class inherit Mouse
val pocket : string
new (namae,contents) = {inherit Mouse(namae);pocket = contents;}
then System.Console.WriteLine("sub class constructor called");
end;;
let dora = new PocketMouse("doraemon","4jigen pocket");;
正如下面执行结果所示,首先调用基本类的构造器。
执行结果
base class constructor called
sub class constructor called
按任何键继续 . . .
type Mouse = class
val name : string
new () = {name = "nezumi"} then System.Console.WriteLine("base class constructor called")
end;;
type PocketMouse = class inherit Mouse
val pocket : string
new (contents) = {pocket = contents;}
then System.Console.WriteLine("sub class constructor called");
end;;
let dora = new PocketMouse("4jigen pocket");;
其执行结果与前面的执行结果相同。
执行结果
base class constructor called
sub class constructor called
按任何键继续 . . .
正如下例所示,当没有接受()作为参数的构造器时,会产生编译错误。
没有接受()作为参数的构造器时会产生编译错误
type Mouse = class
val name : string
new (n) = {name = n} then System.Console.WriteLine("base class constructor called")
end;;
type PocketMouse = class inherit Mouse
val pocket : string
new (contents) = {pocket = contents;}
then System.Console.WriteLine("sub class constructor called");
end;;
let dora = new PocketMouse("4jigen pocket");;
最后,使用默认的构造器,书写的程序如下所示。
默认的构造器
type Mouse(n) = class
member x.name = n : string
end;;
type PocketMouse(n,contents) = class inherit Mouse(n)
member x.pocket = contents : string
end;;
let dora = new PocketMouse("doraemon","4jigen pocket");;