C++ is *not* the only OO language (was: Re: PHP objects and public/private methods)
Giorgos Keramidas
keramida at ceid.upatras.gr
Wed Sep 5 01:11:07 EEST 2007
On 2007-09-04 20:49, V13 <v13 at priest.com> wrote:
>On Tuesday 04 September 2007, Giorgos Keramidas wrote:
>> ok καλά ως εδώ. Ας φτιάξουμε όμως μια `shape-name' generic function
>> που όταν το αντικείμενο είναι κύκλος, τυπώνει και τη λέξη " (circle)"
>> μετά το όνομά του. Για να γίνει αυτό, αρκεί στο "defmethod" που
>> ορίζει την circle-specific function να προσθέσουμε το runtime
>> qualifier :after έτσι ώστε να τρέχει *ΜΕΤΑ* από οποιαδήποτε άλλη
>> μέθοδο έχει κληρονομήσει το circle object (π.χ. την generic
>> (shape-name shape) function):
>
> *gkoyx gkoyx*
> Kai otan exeis polaplh klironomikotita ti ginetai?
> *grin*
Ένα CLOS class δεν έχει μόνο ένα superclass:
CL-USER> (defclass shape ()
((shape-name :initform "A generic shape")))
#<STANDARD-CLASS SHAPE>
CL-USER> (defclass streamable ()
((streamable-name :initform "A streamable object")))
#<STANDARD-CLASS STREAMABLE>
CL-USER> (defclass rectangle (streamable shape)
((shape-name :initform "A rectangular shape")
(streamable-name :initform "A streamable rectangle")))
#<STANDARD-CLASS RECTANGLE>
Τώρα το class `rectangle' έχει δύο superclasses, και μπορεί να κάνει `route'
στο κατάλληλο superclass τα method calls που δέχεται:
CL-USER> (defgeneric shape-name (shape))
#<STANDARD-GENERIC-FUNCTION SHAPE-NAME (0)>
CL-USER> (defgeneric streamable-name (streamable))
#<STANDARD-GENERIC-FUNCTION STREAMABLE-NAME (0)>
Οι δύο generic functions παραπάνω δεν έχουν το ίδιο όνομα, οπότε μπορούμε να
ορίσουμε μόνο στις superclasses την συμπεριφορά τους:
CL-USER> (defmethod shape-name ((s shape))
(let ((name (slot-value s 'shape-name)))
(when name
(format t "~&~A" name))
(when (next-method-p)
(call-next-method))))
#<STANDARD-METHOD SHAPE-NAME (SHAPE) {61DEF671}>
CL-USER> (defmethod streamable-name ((s streamable))
(let ((name (slot-value s 'streamable-name)))
(when name
(format t "~&~A" name))
(when (next-method-p)
(call-next-method))))
#<STANDARD-METHOD STREAMABLE-NAME (STREAMABLE) {61EC1C99}>
Οπότε ένα `rectangle' object υποστηρίζει τις μεθόδους και των δύο superclass:
CL-USER> (defparameter *V13* (make-instance 'rectangle))
*V13*
CL-USER> (shape-name *V13*)
A rectangular shape
NIL
CL-USER> (streamable-name *V13*)
A streamable rectangle
NIL
More information about the Linux-greek-users
mailing list