inicialización clúster Clase
-
01-10-2019 - |
Pregunta
Mi iPhone aplicación tiene un WorkingView clase abstracta. Es una subclase de UIView. WorkingView a su vez, tienen un montón de subclases concretas. Dos de esos serán SimplifyView y MultiplyView.
Estoy tratando de escribir el método que crea nuevas instancias de WorkingView. Este método debe tener el modo aprobada en y devolver una instancia de la subclase concreta apropiado. Por la respuesta a esta pregunta , esto es lo que tengo hasta ahora :
+ (id)newWorkingViewWithFrame:(CGRect)frame mode: (modeEnum) mode {
WorkingView *ret;
switch (mode) {
case simplifyMode:
ret = [[SimplifyView alloc]initWithFrame: frame];
break;
case multiplyMode:
ret = [[MultiplyView alloc]initWithFrame: frame];
break;
// additional cases here
default:
return nil;
}
// more initialization here
return ret;
}
Hasta ahora, todo bien. Pero aquí está el problema. En el método init del SimplifyView, necesito para ejecutar el objeto a través del método init UIView. Llamando [súper initWithFrame: Marco] me pone sólo para WorkingView, no todo el camino a UIView. Supongo que podría crear una initWithFrame: método en el WorkingView que a su vez requiere de UIView initWithFrame:. Método - pero que se siente hacker
¿Cuál es la manera adecuada de manejar esto?
Solución
Si llama desde su [super initWithFrame:frame]
subclase, el tiempo de ejecución será subir la jerarquía de herencia en busca de una clase que implementa este método, a partir de súper. Si no implementa súper initWithFrame:
, el tiempo de ejecución será seguir subiendo hasta que finalmente encuentra e invoca la aplicación por defecto en UIView.