您的位置:首页 > 理论基础 > 数据结构算法

F#入门-第四章 面向对象-第二节 类与构造器

2010-09-20 13:37 141 查看
最小的类
    类是数据与函数的集合,是面向对象编程的一种基本的数据结构。

   
    类的定义如下例所示。

 类的定义    type 类名 [ 模式 ] [ as 识别符 ] = 
        class
            继承声明
            let式
            [元素类型定义]*
        end

    class?end中的内容稍后再介绍,首先让我们来看最小的类。

最小的类
type Minimum = class end;;

    这里是没有字段,没有成员函数,什么都没有的最小类的定义。但这样的类是什么用处也没有的,所以接下来让我们追加字段,介绍两种类的构造器的定义方法。

显式的构造器
  构造器是将类实例化,创建对象时为了进行初始化而调用的函数。在F#中,有两种构造器的书写方法,首先让我们举个例子。

使用显式构造器的类声明
type Explicit = class

    val a : int

    new (data) = {a = data;}

    end;;

let ex = new Explicit(10);;

System.Console.Write(ex.a);;

    使用显式构造器的类声明在声明字段时使用val。另外,从new开始的这一行称为构造器。简略的书写方法如下例所示。

 简略的构造器定义    new 模式 [as 识别符] = {[识别符=表达式 ;]*} [then 表达式]

    上例中在模式中把data作为临时参数,在构造器中把data的值传给a。具体来说,通过new Explicit(10)来调用构造器并把10赋值给data,同时,通过这种方法把10赋值给a。另外,可以通过在对象名后加点,点后加字段名的方式访问用val声明的变量。

    在构造器中更加稍微复杂一点的处理如下例所示。这段程序中,没有在创建对象后进行处理,而是在创建对象的同时进行了处理,得到的结果与上例相同。

在构造器中的处理
type Explicit = class

    val a : int

    new (data) as this = {a = data;}

        then System.Console.Write(this.a)

    end;;

let ex = new Explicit(10);;

    初始化结束后在then语句中继续执行在构造器内执行的初始化之外的处理。同时,如果想要引用构造器内自身的字段值,需要使用as关键字,后面跟类的别名,该别名代表类本身,访问类本身时使用该别名。在这个例子中用this来指定引用类本身,用this.a来访问类本身的字段a。

隐式的构造器
    针对利用类来说,还有一种使用隐式构造器的方法。这是显式构造器之后在F#中追加的功能。

    使用隐式构造器时,在类名后接着指定模式。同时,用let来声明类内部使用的变量。

使用隐式构造器的类声明
type Implicit(x:int) = class

    let a = x;

    end;;

let im = new Implicit(10);;

//System.Console.Write(im.a);; //错误

    像这样用let定义的值,在类的外部是不能引用的。通过这种方式来使用类时,为了要引用到内部的值需要使用成员函数。或许,想要使用显式的字段声明时,需要使用类似DefaultValue的属性,同时还必须加上mutable。

显式的字段的利用
type Implicit(x:int) = class

    let a = x;

    [<DefaultValue>]

    val mutable x : int

    end;;

let im = new Implicit(10);;

System.Console.Write(im.x);;

    这样声明字段相当于把字段用0或""进行初始化。这样,x的值就可以在类的外部被访问了。

    最后,总结归纳成员的定义。

 成员的定义        元素类型定义 :=
      | 字段定义
      | 成员定义
      | 接口定义
    字段定义 :=
      | [static] [mutable] 识别符 : 类型名
    成员定义 :=
      | [ static ] member 成员绑定
      | (override|default) 成员绑定
      | 构造器定义
      | abstract 签名定义
      | val [mutable] 值、签名成员
    构造器定义 :=
      | new 模式 [as 识别符] = 构造器表达式
    构造器表达式  :=
      |  ';'文字 构造器表达式
      | 构造器表达式 then 表达式
      | if 表达式 then 构造器表达式 else 构造器表达式
      | let 变量声明 in 构造器表达式
      | 对象的初始化表达式
    对象的初始化表达式 :=
      | '{' [ inherit 表达式; ] 字段绑定 '}'
      | new 类型 表达式

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  f# class 数据结构 编程 im