您的位置:首页 > 移动开发 > Objective-C

F#入门-第四章 面向对象-第一节 对象

2010-09-19 16:58 232 查看
■ 对象
    F#的面向对象是与.NetFramework的面向对象有着紧密联系的。也就是说,F#具备了与C#等.NetFramework中的语言中面向对象所相同的面向对象机制。因此,F#中支持了OCaml中所不支持的重载(overload)功能,但是另一方面,作为其结果,OCaml中所具有的类型推理的完全性在F#中就不具备了。另外,关于类的描述方法也与Ocaml不同,所以论及面向对象这一部分,F#是与Ocaml互不兼容的,最好理解成两种不同的语言比较好。(关于重载在后文详述)。

类型推理的完全性
类型推理的完全性是指

如果加上类型注释就能进行类型推理的话,那么没有类型注释也可以进行类型推理的这种性质。

这是OCaml中类型系统的优点之一。

    那么,让我们来开始针对面向对象进行思考。
    首先,如果可以针对面向对象作个精确定义就好了,但是面向对象并不是这么简单的。

    因为,构成面向对象这种想法的起源并不是单一的一门语言,是由多个语言共同构成的,而各个语言中关于面向对象的想法又各有区别。

    例如,大多数面向对象的语言中,类是一种模式,实现类并创建对象叫做实例化。

    因此,将对象与类分开来考虑的语言有很多,但是在面向对象的起源之一的Smalltalk等语言中,类本身就是对象,综合起来,就很难对面向对象进行定义了。

    首先,关于类,它是将数据与函数进行集中汇总之后产生的。但是在各个语言中对于数据和函数的称呼方法又各不相同。例如在Java中,将数据称为字段,函数称为方法,在C++中将数据称为成员变量,函数称为成员函数。本书结合Expert F#或Foundations F#的称呼方法,在有必要作区分时,将数据称为字段,函数称为方法或成员函数,没必要进行区分时统称为成员。

    类具有继承的概念,继承了某个类后的类也继承了被继承类中的所有成员。本书中将被继承的类称为父类,继承父类的类称为子类。

    接着让我们进入正题。在.Net Framework中面向对象的代表性语言为C#。一切都是object类的子类。也就是说,所有的类型都可上溯(Upercast)为Object类型。F#中也有相当于这种Object类型的obj类型,所有的类型都可上溯为obj类型。

上溯为obj型
let a = 1 :> obj;;

val a : obj

> let b = "abc" :> obj;;

val b : obj

    :>是上溯时使用的运算符。上溯是指,将任何对象的类型转变为该对象父类的类型,反之将任何对象的类型转变为该对象子类的类型称之为下溯。上溯是安全的,因为编译器总是知道该对象的父类型,下溯是不安全的,因为当前类型未必能够转化为目标子类型。

    在F#中把各类型之间的转变称为转换。转换成obj类型是把任意类型转变成obj类型,与box函数作用相同。

box函数
> let a = box 1;;

val a : obj

> let b = box "abc";;

val b : obj

    同时,也具有unbox函数用来把obj类型的函数转变成原有类型。但是,如果转换不成功则会引发异常,请注意这一点。
 

unbox函数
> let a = box 1;;

val a : obj

> let b = unbox<int> a;;

val b : int

> let c = unbox<string> a;;

val c : string

System.InvalidCastException: 指定的转换无效。

    位置 <StartupCode$FSI_0009>.$FSI_0009._main()

stopped due to error

    因此,下溯时通常使用类型测试运算符:?来判断是否能实现转换。

类型测试运算符的利用
let a = box 1 in

let b = box "abc" in

let check (x:obj) =

         match x with

         | :? int -> System.Console.WriteLine "int"

         | :? string -> System.Console.WriteLine "string"

         | _ -> System.Console.WriteLine "other type" in

check a;check b;;

    类型测试运算符可以当作函数那样来利用。如果象( obj :? type )这样来使用时,obj可以转换为type时返回true,否则返回false。

类型测试运算符的利用之2
> let a = box 1 in if (a :? int) then true else false;;

val it : bool = true

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐