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