• Object Oriented,不同语言中面向对象意义不同
  • goto因强大让人困惑,退出历史。面向对象、Trait也有这因素
  • 两种立场
    • C++, 类是用户自定义类型,Simula语言的继承机制是关键
    • Smalltalk, 类让人痛苦,不要继承,不同状态对象传消息来通信
  • 历史
    • ALGOL产生model思想(1958年), Simula, Smalltalk, C++, Java
    • 类在大部分语言中不是不可或缺的
    • Java: 类是部件,将其组装就是程序设计
  • 归集方法和建模的发展
    • 围绕实现多实例问题
    • 强关联元素分组存放,便于理解
    • module
      • 关联函数集中, 1978年Modula-2引入, Python, Ruby叫模块,Java, Perl叫包
      • 初始化散列, 再作为参数传入包中函数,函数修改散列
      • 包提供初始化函数, 返回散列, 该函数成为构造函数(Java叫工厂方法)。但使用包函数都要传入散列
      • bless函数(Perl)绑定包和散列产生blessed hash对象,它的方法对应包方法, curry了散列做参数
      • 包的初始化函数自己绑定, 返回blessed hash对象
    • 变量和函数放入散列
      • js对象
      • 函数放入散列
        • 函数成为一等公民,可赋值给变量。FORTRAN66中字符串还不是一等公民
          • first-class function的思想来自Scheme语言
      • 函数中通过this隐式获取自身做散列
        • Perl中显示获得散列
      • 创建构造函数,返回以上散列。但返回的散列上都定义了新的函数
      • 把函数单独放置在包或对象, 使用时很麻烦
      • 引入原型概念,对象变量查找作用域在原型链中扩展
        • 这里是委托方式的原型,也可以在实例化时通过负责来实现。原型变更的处理,不同语言有差异
          • prototype-based的思想来自Self语言
      • 定义new f()运算, 函数f的原型是以上散列,多个new的新对象共享了散列的函数
        • 新对象原型指向函数f的原型
        • 以新对象为this,执行f
    • 闭包
    • 继承
  • OOAD