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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top