2011-09-21 8 views
8

Lectura a través de la documentación de Apple en Tips and Techniques for Framework Developers, me encontré con esta declaración acerca de inicializadores designados:¿Cuándo una clase tendrá alguna vez más de un inicializador designado?

Un inicializador designado es un método init de una clase que invoca una init método de la superclase. (Otros inicializadores invocan los métodos init definidos por la clase.) Cada clase pública debe tener uno o más inicializadores designados.

(Énfasis añadido.)

Con base en mi entendimiento y, de hecho, el uso de la palabra "designado", una clase debe tener sólo un inicializador designado. Pero según la documentación, son aceptables múltiples inicializadores designados.

Suponiendo que tiene dos (o más) inicializadores designados, su función es llamar al inicializador designado de la superclase para garantizar la inicialización adecuada del objeto. Pero si ambos inicializadores designados están llamando al inicializador designado de la misma superclase, entonces, ¿por qué había necesidad de más de uno desde el principio? ¿No debería refactorizarse la clase para canalizar todos los demás métodos init al singular inicializador designado?

Estoy un poco confundido en cuanto a qué caso de uso o patrón de diseño requeriría para múltiples inicializadores designados?

+1

A veces los parámetros de cada inicializador son demasiado diferentes para canalizarlos al mismo inicializador "designado". La recomendación es que tenga los inicializadores con los parámetros más mínimos, llame a un inicializador único con la mayoría de los parámetros, pero eso no siempre tiene sentido. – spstanley

+0

Incluso en el caso donde su clase podría tener inicializadores con parámetros ampliamente diferentes, ¿no debería un inicializador ser responsable de llamar al inicializador designado de la superclase? ¿No debería el otro ajustar sus parámetros y consecuentemente llamar internamente al inicializador designado? – LucasTizma

Respuesta

6

Lo haría cuando desee tener una inicialización diferente para diferentes objetos de la misma clase. Un ejemplo son los clusters de clases, como NSNumber. Tiene bastantes inicializadores para los diferentes tipos de números que pueden contener. Para proporcionar la representación más precisa, la clase debe mantener su valor en el mismo formato en que lo recibió, en lugar de emitir. Esto significa que los inicializadores no pueden simplemente llamar a un inicializador común y regresar. Necesitan hacer un trabajo personalizado. Esto los convierte en un inicializador designado.

Otro ejemplo sería una clase de documento que necesita realizar algunas inicializaciones solo para archivos nuevos y alguna otra inicialización solo para documentos que se abren. Ambos inicializadores llamarán a su implementación súper, que a su vez llama al método simple init para realizar una inicialización común. Sin embargo, dado que hacen algo más que simplemente llamar a otro inicializador con un valor predeterminado, se consideran inicializadores designados.

+0

Gracias por la aclaración. – LucasTizma

+4

Un buen ejemplo es 'initWithFrame:' ​​de UIView' y 'initWithCoder:'. Si está instanciando programáticamente, quiere lo primero. Si está cargando desde el archivo, más tarde. Las subclases deben invocar uno de esos (o el equivalente = algo que invocará uno de ellos) en las situaciones apropiadas. – bshirley

Cuestiones relacionadas