You are on page 1of 6

Polimorfizm multi dispatch - oparty na funkcjach

W każdym (prawie) języku programowania mamy do czynienia z


"przywiązaniem" metod do klas. Każda metoda może być wirtualna
(realizować polimorfizm) tylko ze wgględu na klasę w której jest zdefiniowana

Lisp i Julia są przykładem języków, gdzie polimorfizm jest oparty na funkcjach.

Nie ma znaczenia ile parametrów ma funkcja. Może być wirtualna ze względu


na dowolny parametr a nawet dowolną kombinację parametrów.

1
Definiowanie struktury klas i tworzenie obiektów

(defclass Pupil () ;; Zwierzak domowy


((imie :initform "bez imienia" :initarg :imie :accessor imie ))
)

(defclass Kot (Pupil) ;; Kot jest podklasą klasy Pupil


()
)

(defclass Pies (Pupil) ;; Pies jest podklasą klasy Pupil


()
)

;; Żeby się C++sowcom i Javowcom wygodniej czytało :)


(defmacro new (&rest args)
`(make-instance ,@args)
)

(setf kicia (new 'Kot :imie "Kicia"))


(setf mruczek (new 'Kot :imie "Mruczek"))
(setf filek (new 'Kot :imie "Filemon"))
(setf Klakier (new 'Kot :imie "Klakier"))

(setf szarik (new 'Pies :imie "Szarik"))


(setf fafik (new 'Pies :imie "Fafik"))
(setf pluto (new 'Pies :imie "Pluto"))

2
Tworzenie funkcji wirtualnej (generic function)
(defgeneric reakcja (a b)) ;; opisuje interakację między obiektami a i b

;; Można zdefiniować inna wersję dla każdej pary typów argumentów:


(defmethod reakcja (a b) (format t "Nie wiem co myśleć o ~a i ~a. ~%" a b))
(defmethod reakcja ((a integer) (b integer)) (if (< a b)
(format t "liczba ~a jest mniejsza od ~a. ~%" a b)
(format t "liczba ~a jest większa lub równa ~a. ~%" a b)))
(defmethod reakcja ((a string) (b number))
(format t " ~a to napis a ~a to liczba.~%" a b))
(defmethod reakcja ((a string) (b complex))
(format t " ~a to napis a ~a to liczba zespolona.~%" a b))
(defmethod reakcja ((a integer)(b string))
(format t " ~a razy ~a poproszę.~%" a b))
(defmethod reakcja ((a Pupil) (b Pupil))
(format t "Zwierzaki ~a i ~a uważnie się obserwują ~%" (imie a) (imie b)))
(defmethod reakcja ((a Kot) (b Pies))
(format t "Kot ~a ucieka a pies ~a go goni.~%" (imie a) (imie b)))
(defmethod reakcja ((a Pies) (b Kot))
(format t "Pies ~a goni, kot ~a z trudem ucieka. ~%" (imie a) (imie b)))
(defmethod reakcja ((a Pies) (b Pies))
(format t "Psy ~a i ~a szczekają na siebie. ~%" (imie a) (imie b)))
(defmethod reakcja ((a Pies) (b integer))
(format t "Pies ~a chciałby zjeść ~a kiełbaski . ~%" (imie a) b))

3
Wywołanie funkcji generycznej (wirtualnej)
Wywołanie fukcji w pętki rozwiewa wątpliwości, czy polimorfizm jest dynamiczny,
czy statyczny (jak np w C++ przeciążanie funkcji).

(dolist (a (list 2 "1/2" 1/2))


(dolist (b (list 1 "piwko" #c(1 2) 1/3))
(reakcja a b)
)

liczba 2 jest większa lub równa 1.


2 razy piwko poproszę.
Nie wiem co myśleć o 2 i #C(1 2).
Nie wiem co myśleć o 2 i 1/3.
1/2 to napis a 1 to liczba.
Nie wiem co myśleć o 1/2 i piwko.
1/2 to napis a #C(1 2) to liczba zespolona.
1/2 to napis a 1/3 to liczba.
Nie wiem co myśleć o 1/2 i 1.
Nie wiem co myśleć o 1/2 i piwko.
Nie wiem co myśleć o 1/2 i #C(1 2).
Nie wiem co myśleć o 1/2 i 1/3. 4
Wyniki dla zwierząt
(reakcja kicia filek)
(reakcja mruczek fafik)
(reakcja pluto szarik)
(reakcja pluto klakier)
(reakcja pluto 3)
(reakcja (new 'Pupil) (new 'Pupil ))
(reakcja 2 3)
(reakcja 2 1)
(reakcja "ala" #C(0 1) )
(reakcja kicia "ola")

Zwierzaki Kicia i Filemon uważnie się obserwują


Kot Mruczek ucieka a pies Fafik go goni.
Psy Pluto i Szarik szczekają na siebie.
Pies Pluto goni, kot Klakier z trudem ucieka.
Pies Pluto chciałby zjeść 3 kiełbaski .
Zwierzaki bez imienia i bez imienia uważnie się obserwują
liczba 2 jest mniejsza od 3.
liczba 2 jest większa lub równa 1.
ala to napis a #C(0 1) to liczba zespolona.
Nie wiem co myśleć o #<KOT #x0000100000354F01> i ola. 5
Klasy, pola (składowe klas) i akcesory

You might also like