next up previous contents
Next: Abreviaturas Up: Programación orientada a objetos Previous: Métodos

Jerarquías

La utilización de defstruct permite la definición de jerarquías de tipos, es decir, un árbol de tipos en donde las estructuras se corresponden con los nodos y donde los descendientes de un nodo heredan las características de dicho nodo, esto es, sus campos y métodos. El nodo raíz del árbol se denota por #.

Como ejemplo, a continuación se define los tipos lecturer y student que son subtipos de persongif y se crea una instacia para cada uno de ellos:

(defstruct #:person:lecturer
        category)

(defstruct #:person:student
        degree)

(setq Manolo (#:person:lecturer:make))
(setq Pablo (#:person:student:make))

Para obtener la edad de Manolo y Pablo podemos hacer:

(setq manolo-age (#:person:age Manolo))
(setq pablo-age  (#:person:age Pablo))

o bien:

(setq manolo-age (send 'age Manolo))
(setq pablo-age  (send 'age Pablo))

El uso de send es más ineficiente ya que el sistema LE-LISP debe recorrer ascendentemente la jerarquía hasta encontrar el método cuyo nombre coincide con el mensaje, aunque evita al programador el tener que preocuparse del lugar en la jerarquía en que están definidos los métodos. La función send-super es similar a send excepto que comienza a buscar por el método en el nodo padre del objeto pasado como argumento. Otras variantes son send-error, csend y send2.

Por otra parte, al ser posible redefinir los métodos a lo largo de la jerarquía, send aplica siempre el método más cercano ascendentemente al objeto de aplicación, mientras que indicando el nombre completo podemos especificar qué método exacto queremos ejecutar.



Miguel A. Alonso Pardo
Thu Nov 20 15:31:06 CET 1997