newLISP FOOP 创建类和对象

来源:互联网 发布:免费电话软件 编辑:程序博客网 时间:2024/05/22 03:51

类和对象

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类的实现文件中。

创建类的语句一般使用在MAIN context中,如果在别的context中创建类,要用MAIN:前缀,比如:

(context 'Geometry)(new Class 'MAIN:Rectangle)
很好理解,因为类就是一个自定义的context,而自定义的context实际上是MAIN context的一个symbol。

检查是否一个类

现在有了一个名叫Rectangle的类。首字母建议大写。上面说过, class用context实现,这里验证一下。

> (context? Rectangle)true

Class是一个context

关键字Class也是一个预定义的context,定义如下:

; built-in generic FOOP object constructor(define (Class:Class)     (cons (context) (args)))

类的构造函数

默认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) 获得创建对象传递的 第一个参数


创建对象

因为有了类,才可以创建对象。创建方法如下:

(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))