第十一章:Common Lisp 对象系统.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十一章:Common Lisp 对象系统

第⼗⼀章:Common Lisp 对象系统 Common Lisp 对象系统,或称 CLOS ,是⼀组⽤来实现⾯向对象编程的操作集。由于 它们有着同样的 史,通常将这些操作视为⼀个群组。 λ 技术上来说,它们与其他部 分的 Common Lisp 没什么⼤不同: defmethod 和 defun ⼀样,都是整合在语⾔中 的⼀个部分。 11.1 ⾯向对象编程 Object-Oriented Programming 11.2 类与实例 (Class and Instances) 11.3 槽的属性 (Slot Properties) 11. 基类 (Superclasses) 11.5 优先级 (Precedence) 11.6 通⽤函数 (Generic Functions) 11.7 辅助⽅法 (Auxiliary Methods) 11.8 ⽅法组合机制 (Method Combination) 11.9 封装 (Encapsulation) 11.10 两种模型 (Two Models) Chapter 11 总结 (Summary) Chapter 11 练习 (Exercises) 11.1 ⾯向对象编程 Object-Oriented Programming ⾯向对象编程意味著程序组织⽅式的改变。这个改变跟已经发⽣过的处理器运算处理 能⼒分配的变化雷同。在 1970 年代,⼀个多⽤户的计算机系统代表著,⼀个或两个 ⼤型机连接到⼤量的哑终端(dumb terminal) 。现在更可能的是⼤量相互通过⽹络连接 的⼯作站 (workstation) 。系统的运算处理能⼒现在分布⾄个体⽤户上,⽽不是集中在 ⼀台⼤型的计算机上。 ⾯向对象编程所带来的变⾰与上例⾮常类似,前者打破了传统程序的组织⽅式。不再 让单⼀的程序去操作那些数据,⽽是告诉数据⾃⼰该做什么,程序隐含在这些新的数 据“对象”的交互过程之中。 举例来说,假设我们要算出⼀个⼆维图形的⾯积。⼀个办法是写⼀个单独的函数,让 它检查其参数的类型,然后视类型做处理,如图 11.1 所⽰。 (defstruct rectangle height width) (defstruct circle radius) (defun area (x) (cond ((rectangle-p x) (* (rectangle-height x) (rectangle-width x))) ((circle-p x) (* pi (expt (circle-radius x) 2))))) (let ((r (make-rectangle))) (setf (rectangle-height r) 2 (rectangle-width r) 3) (area r)) 6 图 11.1: 使⽤结构及函数来计算⾯积 使⽤ CLOS 我们可以写出⼀个等效的程序,如图 11.2 所⽰。在⾯向对象模型⾥,我们 的程序被拆成数个独⼀⽆⼆的⽅法,每个⽅法为某些特定类型的参数⽽⽣。图 11.2 中 的两个⽅法,隐性地定义了⼀个与图 11.1 相似作⽤的 area 函数,当我们调 ⽤ area 时,Lisp 检查参数的类型,并调⽤相对应的⽅法。 (defclass rectangle () (height width)) (defclass circle () (radius)) (defmethod area ((x rectangle)) (* (slot-value x height) (slot-value x width))) (defmethod area ((x circle)) (* pi (expt (slot-value x radius) 2))) (let ((r (make-instance rectangle))) (setf (slot-value r height) 2 (slot-value r width) 3) (area r)) 6 图 11.2: 使⽤类型与⽅法来计算⾯积 通过这种⽅式,我们将函数拆成独⼀⽆⼆的⽅法,⾯向对象暗指继承 (inheritance) ── 槽 (

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档