(defmethod nombre-genérico lambda-list-especializado {form}* ) Métodos de tipo-de
Funciones Genéricas como soporte de la POO El papel de las funciones genéricas como soporte de LOOs es relativamente nuevo: El modelo clásico se basa en el paso de men-saje: (send instancia nombre-operación arg*) La instancia que recibe el mensaje es la responsable de “interpretar “ y “ofrecer” el servicio. El modelo basado en funciones genéricas se le denomina Modelo de objetos generalizado. En el modelo generalizado es más adecuado cuando no se sabe como descomponer la aplicación en componentes individuales.
Funciones Genéricascomo soporte de la POO Ventajas del uso de func. genéricas: Extensión natural de las funciones genéricas preexistentes en Common Lisp. Todas las funciones se llaman con la misma sintáxis. Permiten definir operaciones para nuevos tipos (Extensibilidad). Son la base para la herencia del compor-tamiento entre clases.
(DEFCLASS trabajador (persona))
(defmethod tipo-de ((x persona)) (format T "~% ~a es una persona" x))
(Gp:) ? (setf Juan (make-instance 'trabajador :nombre 'Juan :empresa 'ACME)) # ? (tipo-de Juan) # es una persona NIL ?
3. Programación con Métodos Cuando una función genérica es invocada CLOS selecciona el conjunto de métodos aplicables, y se ejecuta el más específico. Cuando los métodos de una función genérica especializan un único parámetro se habla de la herencia de métodos. Un método está ligado a una clase o instancia. Cuando los métodos especializan más de un parámetro es más adecuado hablar de la aplicabilidad de un método. Un método está ligado a más de una clase o instancia: (MULTI-METODOS)
Programación con métodos (Gp:) Aplicabilidad de un método: 1. Se seleccionan médodos aplicables: Un método es aplicable si cada uno de sus parámetros especializados es satisfecho por los argumentos corres- pondientes de la función genérica. 2.Se clasifican los métodos en orden de precedencia: Especializar con un valor es más especifico que especializar con una clase. Cuando se especializa con clases, la lista de precedencia de clases indica cual es más específica.
(Gp:) Herencia de un método: Cuando una función genérica tiene un método para una instancia se aplica. Sino, CLOS busca entre los métodos aplicables en las clases padres, y sino encuentra un método aplicable continúa con las superclases de los padres, y así sucesivamente.
Programación con métodos Ejemplo: (Inventario de un almacen) ?(defclass mercancia () ((nombre :initarg :nombre :accessor nombre) (PVP :initarg :precio :accessor precio) (coste :initarg :coste :accessor coste) (cantidad :initarg :cantidad :accessor cantidad :initform 0))) # ?(setf Naranjas (make-instance 'mercancia :nombre 'Naranjas :precio 100 :coste 80 :cantidad 200)) # ?(describe Naranjas) # Class: # Wrapper: # Instance slots NOMBRE: NARANJAS PVP: 100 COSTE: 80 CANTIDAD: 200
Programación con métodos (defmethod describe ((objeto standard-object)) …) (Gp:) (defmethod describe ((objeto mercancia)) …) (Gp:) Parámetro especializado clase
(defgeneric describe (objeto) (:documentacion “Predefinido”) (Gp:) STANDARD-OBJECT (Gp:) MERCANCIA (Gp:) Naranjas
(Gp:) (defmethod describe ((objeto (eql Naranjas)) …) (Gp:) Parámetro especializado valor
?(defmethod describe ((objeto mercancia)) (format t "~% NOMBRE: ~a" (nombre objeto)) (format t "~% PVP: ~a" (precio objeto))(values)) # ?(describe naranjas) NOMBRE: NARANJAS PVP: 100 ?(defmethod describe ((objeto (eql Naranjas))) (format t "~% Las Naranjas están a ~a/kg" (precio objeto))) #
Página anterior | Volver al principio del trabajo | Página siguiente |