OOP語言使用繼承來模擬多態,即創建一個對象類,它可以響應已發佈的消息列表。您可以在Scheme中使用多態,而無需顯式繼承,因爲它是一種動態類型的語言。比較Java中的「動物」類的方案執行情況和它的實現:
// Animal interface and implementations in Java
interface Animal {
void cry(); // The only message to which an Animal object will respond.
}
class Cat implements Animal {
void cry() {
System.out.println ("meow!");
}
}
class Cow implements Animal {
void cry() {
System.out.println ("baee!");
}
}
// Usage
Animal a = new Cat();
Animal b = new Cow();
a.cry(); => "meow!"
b.cry(); => "baee!"
現在計劃使用閉相應的實施:
;; A factory of Animals.
(define (animal type)
(case type
((cat) (cat))
((cow) (cow))))
;; Corresponds to class Cat in Java.
(define (cat)
(lambda (msg)
(case msg
((cry) "meow!"))))
;; Corresponds to class Cow in Java.
(define (cow)
(lambda (msg)
(case msg
((cry) "baee!"))))
;; Sample usage
(define a (animal 'cat))
(define b (animal 'cow))
(a 'cry) => "meow!"
(b 'cry) => "baee!"
事實上,我們需要的前提是我們必須關閉處理太多的私人狀態。 Scheme提供了許多方法來模擬如上所述的簡單的「類層次結構」。這是一個在我們開發了一個小小的「消息調度」功能,我們可以將對象的列表上使用方法:通過方案提供
;; Generic message dispatch.
(define (send type message objects)
((cdr (assq message (cdr (assq type objects))))))
;; A list of animals.
(define animals (list (cons 'cat (list (cons 'cry (lambda() "meow!"))))
(cons 'cow (list (cons 'cry (lambda() "blaee!"))))))
;; Send a specific message to a specific animal:
(send 'cat 'cry animals) => "meow!"
(send 'cow 'cry animals) => "blaee!"
功能抽象機制是強大到足以讓我們不用擔心全對象系統。不過,Scheme還有一些對象系統。看看Tiny-CLOS(根據CLOS)。本書Lisp in Small Pieces討論了一個Scheme對象系統的實現(基於Meroon)。
+1我不認爲這是一類,無論是。 – anthares 2010-03-05 13:10:50
這些「OOP」系統使用閉包,原始Scheme和宏來實現可讀性。 CLOS也是這樣實施的。正因爲如此,他們同樣不屬於「一類」。 這就是Lisp家族的美麗。 當然,你總是可以爭辯說他的實現是不完整的,而且他缺少<在這裏插入你最喜歡的面向對象功能>。 – 2010-05-23 13:39:13