Hola. Hoy vamos a examinar una sutileza muy interesante
que puede aplicar en sus programas.
Para comenzar, revisaremos rápidamente el programa de dados
Si recuerda, en este ejercicio definimos la clase de dados en orden
para definir instancias de esta clase y representan varias caras de dados.
Definimos una clase llamada DiceHandle.
Luego implementamos el método "más"
en la clase DiceHandle,
agregar DiceHandles y construye un nuevo DiceHandle.
Este es el código para esta clase.
Tenemos DiceHandle nuevo.
Creamos un nuevo DiceHandle,
a lo que agregamos los dados de la clase receptora
y la configuración,
y devolvemos este identificador Al final del método. ¿Bueno?
En esta secuencia veremos la diferencia,
en este método "+" entre escribir DiceHandle nuevo
y auto clase nuevo.
Y veremos por qué. una técnica es mejor
Este es el problema.
Si creo una subclase DiceHandle llamado MemoDiceHandle,
y quiero agregar MemoDiceHandles,
con el método "+" que se hereda de DiceHandle,
el resultado es una instancia de la clase DiceHandle.
No de la clase MemoDiceHandle.
Esto es un problema porque cuando agregamos elementos,
queremos obtener el mismo tipo de elemento de nuevo.
Cómo hacemos esto?
Solución n. ° 1.
Cambio la implementación
del método "+" en la clase DiceHandle.
El método "+", ¿de acuerdo?
Y simplemente agrego este método: self handleClass.
En lugar de definir la variable de instancia que deseo obtener,
Yo uso un método que llamo handleClass.
En DiceHandle, se devuelve la clase DiceHandle,
y en la subclase MemoDiceHandle, Se devuelve MemoDiceHandle.
Tan simplemente redefiniendo el método handleClass,
obtenemos la instancia correcta cuando agregamos elementos.
Si ejecutamos el mismo código,
usando MemoDiceHandle en su lugar, obtenemos una instancia de MemoDiceHandle,
porque redefiní el método handleClass
en la clase MemoDiceHandle. Tenemos una instancia de la subclase.
Entonces alcanzamos nuestro objetivo.
El problema es ese
cada vez que agregamos una subclase a DiceHandle,
debemos redefinir el método handleClass.
Si no lo haces, el método "+" nunca Devuelve la instancia de clase correcta.
Esto es tedioso. Debes constantemente redefinir el método.
Hay mejores formas
Aquí está la solución n. ° 2.
Usando el método "+" en DiceHandle, esta vez escribiremos:
auto clase nuevo
Le preguntaré al receptor actual para su clase,
Para obtener una instancia.
De hecho, la autoestima siempre regresa la clase del receptor.
Si es la instancia de una subclase,
devolverá la clase correcta. Por ejemplo, MemoDiceHandle.
Obtenemos instancias del mismo tipo como la del receptor.
Como conclusión,
como tu viste,
cuando envíe el mensaje "+" a un DiceHandle,
si establece el nombre de la clase quieres una instancia para,
en cierto sentido te previenes a ti mismo desde la creación de subclases.
Pero con una clase propia nueva, los retornos "+" una instancia del receptor.
De la subclase potencial.
Entonces es mucho mejor usar auto clase nuevo,
para obtener directamente
una instancia de la clase de acuerdo con el tipo de receptor.