程序原本(五十六):程序设计的核心思想——对象系统:表达、使用与模式(对象是“属性包”:方法与事件可以视为属性的特例)

阅读数:28 2019 年 10 月 1 日 16:48

程序原本(五十六):程序设计的核心思想——对象系统:表达、使用与模式(对象是“属性包”:方法与事件可以视为属性的特例)

将对象作为“一种数据”来观察,则所谓 PME 中的方法(M)与事件(E)就可以视为是“面向对象逻辑需求的”特殊属性(P)。其中,方法是对象创建之前即可确知的自有逻辑,事件则是在对象创建时仍有未定因素的外部逻辑,这二者本质上也是对象的性质。如图 19 所示。

图 19 PME 作为语言特性所实现的抽象概念

程序原本(五十六):程序设计的核心思想——对象系统:表达、使用与模式(对象是“属性包”:方法与事件可以视为属性的特例)

所以 PME 其实只是概括了对象属性,而无助于得到这一对象本身。也就是说,从 PME 的角度上来思考,只是对对象的细节刻画;如何从目标系统中识别到该对象,则是刻画它的前提。

对象的继承性则是对“对象如何获得”的一个解释。如同我们说整数作为数据,在它的系列中的关系为“+1”一样,继承性约定了对象——这个数据在它的系列中的“关系”为层次继承7,如图 20 所示。

7 在“10.1 抽象本质上的一致性”中我们曾经将“(对象)可以作为其他对象的性质”理解为它作为数据系列时的外延。当时我们只讨论了它结构化的一方面而没有拓展这一外延性质,因为“数据的可引用性”是结构类型(Struct types)的基础,是对象之于结构类型类似之处。然而现在我们约定了系列关系之一为“继承”,其基础是“层次间的相似性”,在这一语境之下可引用性将是实现继承的一个工具,例如“封装”。不过仍然需要强调的是,“继承”是系列关系之一,而非惟一,亦非必须。

图 20 基本的对象继承

程序原本(五十六):程序设计的核心思想——对象系统:表达、使用与模式(对象是“属性包”:方法与事件可以视为属性的特例)

若对象 C 继承自 B,B 继承自 A,则 C 必继承自 A,即 C 必具有 A 都有的属性性质。如同人位于生物继承关系的最末端,因而人必然有所有生物的所有基础性质。又如图 21 所示。

图 21 对象继承性的衍化与证明

程序原本(五十六):程序设计的核心思想——对象系统:表达、使用与模式(对象是“属性包”:方法与事件可以视为属性的特例)

基于以上推论,若对象 A 具有某唯一性质,例如“A 是对象”,则 X、B、C 都“必为对象”。因此,对象的继承性保证了对象系统中的每一个数据都必然是对象。

但是对象 X 与对象 C 又各自具有不同性质,例如人与马具有所有陆生动物的性质,但人与马又有不同。这一点,又是通过对象的多态性来说明的。多态性意味着对象 X 与对象 C 是在对象 B 的基础上相同的,但在其各自的表达范围中却是不同的(多态)。例如图 22 说明对象 X、C 在范围{B}中是相同的,但在范围{X}和{C}中各自不同。由此,我们可以进一步推论图 23 中的对象 X1、X2 与对象 C 在范围{B}中也是相同的:

图 22 X 与 C 是范围{B}中同类对象的多态

程序原本(五十六):程序设计的核心思想——对象系统:表达、使用与模式(对象是“属性包”:方法与事件可以视为属性的特例)

图 23 继承性决定了 X1、X2 与 C 在范围{B}中的多态关系

程序原本(五十六):程序设计的核心思想——对象系统:表达、使用与模式(对象是“属性包”:方法与事件可以视为属性的特例)

由此可见,多态性是对象的性质在其继承关系上的表现。由于继承关系本身即是附加的性质,因而多态性也是附加的性质。

评论

发布