9.4 具体的对象类型

面向对象编程中的最重要的结构,就是类的声明。它的价值体现用 F# 写的库,可以在 C# 中使用,因为从 C# 中引用F# 声明的类时,看起来就像普通的类。从概念上讲,类有一点像带成员的记录,因为,它们把值存储在字段中,并提供成员进行访问;类还有另外的功能,在 F# 中,出现下列情况,通常使用类:

■ 需要封装数据和行为时。

■ 在迭代开发过程的后期,把简单的元组或记录转换成更进化的类型,以隐藏内部实现。

■当类型需要在构造器的内部运行一些计算时。

当需要设计可扩展的类型,支持添加操作时,不要使用类;实现继承和虚拟方法很少使用。

我们先看一个可能是最简单的例子。清单 9.14 显示了一个有构造函数的类声明,它有几个属性和一个方法。

清单 9.14 带有客户信息的类 (F# Interactive)

> type ClientInfo(name, income, years)=      [1]

letloanCoefficient = income / 5000 * years  | 在构造时运行

do printfn"Creating client ‘%s‘" name      |

member x.Name =name     |

member x.Income =income  | [2]

member x.Years =years      |

member x.Report()=                                   | [3]

printfn "Client: %s, loan coefficient: %d" name loanCoefficient |

;;

type ClientInfo = (...)

> let john = new ClientInfo("JohnDoe", 40000, 2);;   <-- 创建类,运行构造函数

val john : ClientInfo

Creating client ‘John Doe‘

> john.Report();;     <-- 调用类的方法

Client: John Doe, q=16

val it : unit = ()

类声明的开始是类的名字和构造函数参数[1]。接下来的几行,直到第一个成员声明之前,都会在构造期间执行;这部分代码构成了隐式构造函数(implicit constructor)。构造函数的参数(如 name 等)和在初始化代码中声明的值(如 loanCoefficient),在类的内部任何地方都可以访问;这是非常有用的,因为,C# 的构造函数通常只复制其参数值给私有字段,因此,它们能够从其他地方访问。如果只在构造函数代码内部使用参数,就不保存为字段,因为,编译器知道不再需要它。

接下来,是类声明的三个成员,把构造函数的参数值公开为客户的属性[2],和一个方法[3]。就像在F# 的数据类型上添加成员一样,前缀 x. 表示类的当前实例,可以使用值 x 来访问;我们可能会用它来调用其他方法,或者读其他属性。

注意

F# 提供声明类的功能,要比我们在这个例子中看到丰富得多。F# 语言的目标是成为.NET 的一等公民(first-class .NET citizen),所以,在 C# 几乎所有能用的,都可以转换到 F#;然而,在通常的 F# 编程中,我们并不需要高级的 .NET 对象模型的功能,比如,重载构造函数(overloaded constructors)、重载方法(overloadedmethods),还有,公开访问字段。

本书的目的是介绍函数式概念,而不是解释每一项 F# 功能,因此,我们只讨论 F# 提供的最有用的面向对象的构造,看它们如何使用函数风格。要找到更多关于类声明的信息,可以浏览本书的网站,另外,还可以参考本书结尾的参考资料一节中提到的 [F# 文档] 和 [F# 语言规范] 。

前面示例中的类仍然是纯函数式的,因此,它没有任何可变状态;这说明了面向对象和函数范式是可以很好地结合在一起的。

时间: 2024-07-29 05:50:37

9.4 具体的对象类型的相关文章

hibernate 大对象类型的hibernate映射

基本知识: 在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应. CLOB 表示字符串大对象(Character Large Object), BLOB表示二进制对象(Binary Large Object) Mysql

获取对象类型

获取对象类型 由 王巍 (@ONEVCAT) 发布于 2015/05/27 我们一再强调,如果遵循规则的话,Swift 会是一门相当安全的语言:不会存在类型的疑惑,绝大多数的内容应该能在编译期间就唯一确定.但是不论是 Objective-C 里很多开发者早已习惯的灵活性,还是在程序世界里总是千变万化的需求,都不可能保证一尘不变.我们有时候也需要引入一定的动态特性.而其中最为基本但却是最为有用的技巧是获取任意一个实例类型. 在 Objective-C 中我们可以轻而易举地做到这件事,使用 -cla

&lt;Python内置对象类型&gt;

核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set),frozenset,类型,None 其他文件类工具:pipes,fifos,sockets. 类型转换: str(),repr()或format():将非字符型数据转换成字符: int():转换为整数 float():转换为浮点数 list(x):可以把字符串x转换为列表, tuple(x):将字符

JAVA 【引用类型】和【对象类型】在【继承】中的异同

介绍 JAVA [引用类型]和[对象类型]在[继承]中的异同.这个问题自己整理过N次.也被人当菜鸟问过N次.所以,在此简单整理一下.以供大家分享. 在继承关系中.一般成员变量是依据引用类型 在继承关系中.静态成员变量是依据引用类型 在继承关系中,一般方法是依据对象类型 在继承关系中,静态方法是依据引用类型 注意 静态成员变量,静态方法是基于类的,本文为了測试观察.所以.会用对象去引用静态成员变量和静态方法. Super Class: package shuai.study.inherit; pu

Python中的对象类型的初步介绍

一:介绍 1.为什么使用内置对象 对象类型是语言的一个部分 内置对象构成了每个python程序的核心部分 2.核心数据类型 数字 字符串 列表 字典 元组 文件 集合 其他类型 编程单元类型 与实现相关的类型 二:数字 1.**是乘方 2.math数学模块 3.random模块 三:字符串 1.介绍 字符串是单个

Python 二、Python对象类型及其运算

一.Python对象的相关术语 Python中一切皆对象,python程序中保存的所有数据都是围绕对象这个概念展开的:所有的对象都是由类实例化而来的,只不过这些类有些是python内置的类:例如,整数和浮点数,字符串都是由python内置的类实例化而来的.除此之外用户还可以自定义类型,就是类. python程序中存储的所有数据都是对象 每个对象都有一个身份.一个类型和一个值 例如,school="MaGe Linux"会以"MaGe Linux"创建一个字符串对象,

JavaScript中对象类型的转换小结

对象到字符串和对象到数字类型的转换涉及到两个重要的方法,最终的转换结果会受到这两个方法返回结果的影响,这两个方法就是toString和valueOf.所有的对象都会从Object对象中继承到这两个方法.toString方法 用于返回对象的字符串表示(但是其实也可以不返回字符串).对于默认从Object继承而来的toString方法并不会返回太多有意义的内容.而valueOf方法目的是返回一个可以表示对象的原始类型值,但是由于对象的复杂性,大多数情况下根本不可能用一个原始类型值来表示,所以默认的v

javascript 判断对象类型

typeof typeof是一个一元运算符,它返回的结果 始终是一个字符串,对不同的操作数,它返回不同的结果. 此表总结了typeof所有可能的返回值: 操作数类型 返回值 undefined "undefined" Null "object" Boolean "boolean" Number "number" String "string" 函数对象 "function" E4X XM

jsp中遇到Integer的方法valueOf()和parseInt()的区别.前者要求是对象类型,后者是数字型字符串

他们有本质区别,Integer.valueof(String s)是将一个包装类是将一个实际值为数字的变量先转成string型再将它转成Integer型的包装类对象(相当于转成了int的对象)这样转完的对象就具有方法和属性了. 而Integer.parseInt(String s)只是将是数字的字符串转成数字,注意他返回的是int型变量不具备方法和属性 Integer.parseInt()把String 型转换为Int型, Integer.valueOf()把String 型转换为Integer

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type