【部分源代码读后感】虽然都说 Pascal 是典型的面向过程语言
pascal吧
全部回复
仅看楼主
level 1
黄金止手 楼主
但 Free Pascal 已经有一些挥之不去的面向对象特征了。
FP 文档里也说过 FPC 大部分都是拿面向对象的 Pascal 写的……
FP 可以拿 object 关键词写 OOP ,虽然功能不及 C++ 宏大,但该有的东西(私有、公有、继承、虚函数等)都不缺。
就算不用 object ……
其实我们每个程序都用到的 Text 类型(默认的输入、输出就是 Input:Text; Output:Text)的运用就是利用多态,和虚函数原理相同的。而且 ReadStr / WriteStr 也用到了 Text 类型,只不过让变量关联到字符串而非文件。
Text 类型本质上是记录类型 TextRec ,Pascal 为了避免用户轻易非法修改,就让用 Text 这个类型读取时无法直接处理内部成员,源代码(text.inc & textrec.inc)里都是把 Text 强制转换成 TextRec 类型后操作的。
TextRec 的定义中有四个无类型指针成员: OpenFunc, InOutFunc, FlushFunc, CloseFunc 。
可以在后面的代码中看到,这几个指针在不同情况下会关联给不同的函数。而这种关联和输入输出类型是相关的。
IO 类型分为
文件读取
文件写入
字符串读取
字符串写入
这几大类(严格说来还有更详细的区别)
而且 UserData 成员仅用于 Text 关联给字符串时的情况。
这种情况非常像是定义了一个文本类型的基类,它拥有纯虚(抽象)的方法。而子类(也就是具体打开文件或关联到字符串后的 Text 类型)带着虚方法表。
UserData 数组很像是子类在继承基类后增加的成员的地位。
而具体读写数据就是只按基类处理,根据虚方法表来看具体执行何种子类的方法。这正是面向对象的多态。
Text (TextRec) 类型及其读写虽然全程使用面向过程语法,但拥有面向对象的本质。
可能是因为历史原因, Pascal 的标准输入输出才没有使用对象的语法实现。
2016年07月06日 16点07分 1
1