FOOP 编程全称是:Functional Object-Oriented Programming
感觉是一种混合了函数式编程和面向对象编程的编程思想。它有几个原则, Lutz的英语不是母语,有时候文档表达的也不太清楚。在看下面的原则之前,先明确一点:
newlisp用context表示class,用list表示object.
1. 类的属性和方法被保存在类所在的context里(这句话其实意思有点问题,应该表达成类就是一个context,它的属性和方法就在这个context中)
2. context的默认函数包含了类的构造函数(这句很好理解)
3. 一个对象是用一个list表示的,第一个元素是context
4. 多态用冒号:操作符实现。意思是使用不同类型的相同函数,这里没有继承的意思,仅仅是多态。
5. 在类的方法中可以通过self引用到当前对象,也就是类似与this的功能。
(new Class 'Rectangle)
就这么简单。现在有了一个名叫Rectangle的类。首字母建议大写。上面说过, class用context实现,这里验证一下。
> (context? Rectangle) true
关键字Class也是i一个预定义的context,定义如下:
; built-in generic FOOP object constructor (define (Class:Class) (cons (context) (args)))
类只能创建在MAIN context中,如果在别的context中创建类,要用MAIN:前缀,比如:
(context 'Geometry) (new Class 'MAIN:Rectangle)很好理解,因为类就是一个自定义的context,而自定义的context实际上是MAIN context的一个symbol。
因为有了类,才可以创建对象。创建方法如下:
(Rectangle 10 20)
(set 'rect (Rectangle 10 20))
下面是创建一个list来容纳多个对象
(set 'shapes (list (Circle 5 8 12) (Rectangle 4 8) (Circle 7 7 15))) → ((Circle 5 8 12) (Rectangle 4 8) (Circle 7 7 15))
默认newlisp会创建一个构造函数,不过你可以自己定义一个来取代默认的。
; overwrite simple constructor (define (Circle:Circle x y radius) (list Circle x y radius))也可以用默认参数值
; constructor with defaults (define (Circle:Circle (x 10) (y 10) (radius 3)) (list Circle x y radius))
没什么特殊情况,用不着自己改写构造函数。因为你完全可以在构造的时候加上参数,这些参数都会被自动保存为对象的属性,然后用self来获取。
(self) 获得对象list,第一个是class名称,后面都是被保存的参数
(self 1) 获得创建对象传递的 第一个参数