Next: , Previous: Functions, Up: Top



5 面向对象编程

面向对象编程是一种近年来非常流行的编程方式。 它的流行主要来之一个事实就是它让编写和维护一个复杂系统变得比较容易。 它通过几种不同的机制来实现这个目标的。

任何面向对象语言的中心都是类(class)和方法(method)这两个概念。 类是一个对象的定义。通常一个类包含了多个 用于保存类特有信息的槽变量(slots)1。编程语言中的对象指的 是类的具体实例。编程就是基于这些类的对象或实例。

计算过程是通过方法(methods)实现。方法主要是 用于实现在某个类的对象上进行专门计算的函数。 这就是为什么使得语言面向对象了。在R里面,由泛型函数(generic functions) 来决定适当的方法。泛型函数负责判断它的参数的类并且用这些信息选择 恰当的方法。

大多数面向对象语言的另外一个特性是“继承”这个概念。在大多数编程问题中, 许多对象通常是相互关联。如果一些东西可以重用,编程会变得比较简单。

如果一个类从另外一个类继承而来,它常常会从父类得到所有的槽变量, 而且还可以增加新的槽变量。在方法分发的时候(通过泛型函数),如果 一个类的方法不存在,那么就会在它的父类里面搜索。

在本章,我们会讨论这种通用的策略如何在R里面已经实现, 并且讨论当前设计中一些局限性。大多数对象系统都会体现的一个优点是 它有很好的一致性(consistency)。这通过编译器或解释器按照一定的规则检查实现。 不幸的是,因为 R 和对象系统融为一体,这个优势不能完全体现。 用户在一种直接的方式下面使用对象系统必须十分的小心。 虽然可以展示一些非常有趣功能, 但这些倾向导致模糊的代码和可能依赖一些不会再被采用的实现细节。

R里面最广泛的面向对象编程运用是 print方法,summary方法和plot方法的使用。 这些方法允许我们只要有一个泛型函数调用,比如说 plot,它会基于它的参数类型分发方法并且针对特定的 数据调用相应的绘图函数。

为了使概念更清晰,我们将考虑一个概率论教学用的小系统的实现。 在这个系统中,对象是概率函数和计算矩及绘图的方法。 概率常常可以通过累计分布函数来描述, 但也可以通过其它方法实现。例如,一个密度函数,它可以单独存在,也可以 作为一个矩发生函数存在。


Footnotes

[1] 译者注:类似“成员变量”,用@符号 访问