En la Figura 2.1 del Browser, debajo del panel de clases, hay tres botones:
instance: para acceder a los métodos de
instancia de la clase seleccionada. Estos métodos se aplican a todas
y cada una de las instancias de la clase. Cada instancia reacciona a
ellos.
?: para acceder a la documentación –comentario– de la
clase seleccionada.
class: para acceder a los métodos de clase de la
clase seleccionada. Estos métodos son accesibles sólo desde la propia
clase. Sólo los objetos clase reaccionan a métodos de clase.
Observa el amplio panel de texto debajo de estos tres botones, que proporciona información contextual sobre el elemento seleccionado.
Una vez más, los métodos de clase se aplican a la propia clase. Los
métodos de instancia se aplican a todas las instancias modeladas por la
clase. Hemos visto anteriormente que la clase Fraction tiene
un método #numerator:denominator: que se utiliza para obtener
una nueva instancia de Fraction. Solo hay un objeto de clase
Fraction. Los mensajes como #squared y #abs se envían
a cualquier instancia de Fraction, de las que hay muchas.
Hasta ahora, hemos intentado ser muy cuidadosos con las definiciones,
pero ya sabes que cuando decimos «una fracción» nos referimos a «una
instancia de la clase Fraction». A partir de aquí, nuestro
lenguaje será más informal.
Cuando se selecciona la clase
Float, ¿qué información proporciona el panel de texto?
Ejercicio 3.1: Información de la clase Float
Hemos dedicado mucho tiempo a este tema porque es importante evitar la
confusión entre los métodos de instancia y los métodos de
clase. Consideremos la clase Float como ejemplo.
Métodos de clase. En la Figura 3.1 los métodos
listados son del lado de la clase, con el botón class pulsado en
el Browser, se puede ver esta lista.
Figura 3.1: Métodos de clase en Float
Desde un Workspace, estos métodos se llaman con el nombre del mensaje directamente a la clase:
Float e ⇒ 2.718281828459045 Float epsilon ⇒ 2.220446049250313e-16 Float fmax ⇒ 1.7976931348623157e308
Habrás notado que el texto que escribes en el espacio de trabajo se colorea y resalta según lo que escribes. Hablaremos de esto más adelante, cuando tratemos el lenguaje Smalltalk, pero la idea es que resulte útil. Si empiezas a escribir una palabra que el espacio de trabajo de Cuis conoce, puedes pulsar la tecla tab y obtendrás un conjunto de opciones para completar la palabra. Prueba a escribir
Float epsiy pulsa la tecla tab. A continuación, pulsa la tecla enter y deberías verFloat epsilon. Haz clic en cualquier otro lugar del espacio de trabajo para que desaparezca este menú.
Sin embargo, no se puede enviar un mensaje de clase a una instancia de
Float, ya que se produce un error y se abre la ventana roja
del depurador. Por ahora, basta con cerrar la ventana del depurador para
ignorar el resultado.
3.14 pi ⇒ MessageNotUnderstood: SmallFloat64>>pi Float pi e ⇒ MessageNotUnderstood: SmallFloat64>>e
Con frecuencia, estos métodos de clase se utilizan para acceder a valores constantes, como se ve en el ejemplo anterior, o para crear una nueva instancia:
OrderedCollection new ⇒ Create a new empty ordered collection Fraction numerator: 1 denominator: 3 ⇒ 1/3 "a fraction instance" Float new ⇒ 0.0 Float readFrom: '001.200' ⇒ 1.2 Integer primesUpTo: 20 ⇒ #(2 3 5 7 11 13 17 19)
Métodos de instancia. En la Figura 3.2, los
métodos listados son los de la parte instancia, con el botón
instance pulsado en el Browser, aparece esta lista.
Figura 3.2: Métodos de instancia en Float
En un Workspace, estos métodos se llaman con el nombre del mensaje enviado directamente a una instancia:
-10.12 abs ⇒ 10.12 3.14 cos ⇒ -0.9999987317275395 -10.12 * 2 ⇒ -20.24
Los mensajes a métodos de instancia no se pueden enviar directamente a una clase, necesitas primero instanciar un objeto:
Float cos ⇒ MessageNotUnderstood: Float class>>cos Fraction squared ⇒ MessageNotUnderstood: Fraction class>>squared OrderedCollection add: 10 ⇒ MessageNotUnderstood: OrderedCollection class>>add:
Por supuesto, puedes mezclar tanto métodos de clase como de instancia, mientras envíes el mensaje correcto a la clase o la instancia:
Float pi cos ⇒ -1.0 Float e ln ⇒ 1.0 (Fraction numerator: 4 denominator: 5) squared ⇒ 16/25 OrderedCollection new add: Float pi; add: Float e; yourself ⇒ an OrderedCollection(3.141592653589793 2.718281828459045)
Otro ejemplo desde Spacewar! mezclando métodos de clase e instancia. Este trozo de código actualiza la orientación de un torpedo de acuerdo con su vector de velocidad:
self rotation: (velocity y arcTan: velocity x) + Float halfPi
Ejemplo 3.2: Alineando un torpedo con su dirección de velocidad
Con esta breve introducción al browser del sistema estás preparado para explorar el sistema de clases.