Hola a todos, este video muestra algunos puntos avanzados en las clases.
Tiene tres partes principales.
En primer lugar, cómo compartir un estado entre instancias de una clase y sus subclases.
En segundo lugar, cómo habilitar las clases tener sus propias variables
En tercer lugar, cómo inicializar las clases.
Primero, cómo compartir un estado entre instancias
Aquí tenemos una clase con varias instancias
Para compartir un estado, estas instancias requieren un objeto común
En Java, utilizamos una variable de "instancia" que toma la palabra clave "estática".
El valor de una variable estática
es el mismo para todas las instancias.
En Pharo, usamos "variables de clase".
Esto debería ser una expresión familiar Eso nos permite crear clases.
Aquí creamos la clase Color, que es una subclase de objeto.
Primero, enumeramos sus variables de instancia, luego eche un vistazo a la línea a continuación.
Enumera las variables de clase de la clase Color.
La clase de color tiene al menos dos variables, ColorRegistry y ComponentMask.
Valores de una variable de clase
se comparten entre todas las instancias de la clase y las subclases.
Estas variables son accesibles desde ambos métodos de instancia y clase.
Comienzan con una letra mayúscula.
Volvamos a nuestro ejemplo.
Aquí tenemos nuestra clase de Color,
que es una instancia de la clase de color metaclase.
La clase Color define dos variables estándar, rgb y alfa.
Estas variables de instancia son privadas,
lo que significa que solo son accesibles utilizando los métodos de la clase Color.
También define ColorRegistry, que está subrayado y usa mayúsculas.
Esto indica que esta variable está compartido.
Es una variable de clase que es accesible.
por los métodos de la clase Color y los de la clase Clase de color.
Aquí hay unos ejemplos de los usos de esta variable.
En un método de instancia, el de privateBlue en la clase Color,
accedemos a la variable de clase usando su nombre
Del mismo modo, si queremos darle a esta variable un valor,
usamos un signo de igual a dos puntos, como con cualquier variable.
Podemos hacer esto en el lado de la instancia o de la clase.
Muy a menudo,
los valores de estas variables de clase se puede leer
dentro de los métodos de instancia,
y están escritos dentro de los métodos de clase.
Esto es lo que ocurre con mayor frecuencia, no es obligatorio
Ahora veamos Variables de instancia de clases.
No es lo mismo
Una clase es un objeto, Como todo lo demás.
Como todos los objetos, una clase puede tener instancias.
La metaclase describe la clase y enumera las variables de instancia
que solo se puede acceder por su única instancia, su clase.
Para definir una variable de instancia en el lado de la clase,
hacemos clic en el botón "clase" en el navegador de código.
Eso nos da la expresión aquí.
Entonces, ahora estoy navegando la clase RPackageSet.
La metaclase de esta clase define una variable denominada cachePackages.
Estas variables solo se pueden acceder. de los métodos de clase
y siempre comienzan con una letra minúscula.
Aquí hay un ejemplo.
La variable cachePackages se define en la clase metaclass RPackageSet.
Esto significa que
la clase RPackageSet, que es una instancia de la metaclase,
tiene un valor asociado con esta variable.
Similar,
todas las instancias de las subclases de la clase RPackageSet
tener un valor específico para esa variable, que es un valor diferente.
No se puede compartir aquí.
Cada instancia de la clase RPackageSet o sus subclases
tiene su propio valor para esta variable.
Variables de clase y variables de instancia En el lado de la clase hay cosas diferentes.
Explicaremos esto usando el patrón de diseño Singleton,
cuyo objetivo es garantizar que una clase tiene solo una instancia.
Una solución para ejecutar este patrón es almacenar, dentro de una variable,
la instancia que es de libre acceso y deshabilitar la creación de una nueva instancia.
Eso es lo que haremos aquí con WebServer
Aquí utilizamos una variable de instancia en el lado de la clase.
Su nombre toma minúsculas.
Esta variable se define en la definición de la metaclase.
Ahora deshabilitamos la ejecución. del método "nuevo".
No se pueden enviar mensajes a Clase WebServer para crear nuevas instancias.
Es imperativo ir a través de uniqueInstance,
que devuelve el valor de la variable si no es nada y tiene contenido,
o bien agrega algo a la variable usando "super nuevo".
Crea una nueva instancia de la clase WebServer,
y lo almacena en la variable uniqueInstance.
El hecho de que usemos variables de instancia de clase
conduce al siguiente resultado.
Cada subclase de la clase WebServer
tendrá su propio valor
para una instancia única.
Entonces, si WebServer tiene tres subclases,
la variable uniqueInstance Tendrá un total de cuatro valores.
Uno para WebServer y para cada subclase.
Si ahora usamos una variable de clase,
editamos la clase en el lado de la instancia
y agregamos UniqueInstance, usando una U mayúscula.
Nuevamente rechazamos el envío de mensajes "nuevos" e implementa UniqueInstance.
La unica diferencia es que usamos una U mayúscula.
Como resultado de elegir una variable de clase,
la jerarquía de clase tiene solo un singleton
Si WebServer tiene tres subclases,
estas tres subclases y WebServer comparten el mismo singleton
Por lo tanto, tenemos una instancia compartida por todos.
Ahora para la inicialización de clases.
Podemos tener variables compartidas entre una clase y sus instancias,
pero en algun momento debemos darles un valor.
Hacemos esto cuando inicializamos la clase.
Los objetos se inicializan cuando se envía el mensaje de inicialización.
Del mismo modo, podemos enviar el mensaje de inicialización a una clase.
Decidimos cómo inicializar variables usando el código del método de inicialización.
Si queremos inicializar la clase de color,
le enviamos el mensaje de inicialización.
Típicamente, cuando una clase se carga en el sistema
por la herramienta de control de versiones,
el mensaje de inicialización Se envía a todas las clases.
Esto es automático, no hay necesidad de enviar el mensaje
manualmente a todas las clases cargadas.
Pero si implementamos una clase,
si creamos una nueva clase usando el método de inicialización
debemos enviar el mensaje manualmente.
Aquí hay un ejemplo en la clase Color.
Podemos ver que estamos en el lado de la metaclase.
Aquí inicializamos varias variables de clase,
o variables de instancia en el lado de la clase.
Hay dos tipos de variables aquí.
En los métodos de inicialización,
nunca usamos super inicializar en el lado de la clase.
Cuando agregamos un método de inicialización Por el lado de la instancia,
nosotros sistemáticamente llamamos súper inicializar
para inicializar todas las variables de instancia de un objeto recién creado.
Pero para las clases,
ya que existen clases y superclases cuando se envía el mensaje de inicialización,
no llamamos súper inicialización en el método de inicialización
en el lado de la clase para evitar reiniciar las clases.
Aquí están las comidas para llevar.
Utilizamos las variables de clase para compartir un estado.
Las clases son objetos que puede tener sus propias variables,
entonces usamos variables de instancia en el lado de la clase.
Para inicializar una clase, le enviamos un mensaje de inicialización
y aplicar el método de inicialización en el lado de la clase.