Question

Mon iPhone app a une WorkingView classe abstraite. Il est une sous-classe de UIView. WorkingView aura à son tour un tas de sous-classes concrètes. Deux d'entre eux seront SimplifyView et MultiplyView.

Je suis en train d'écrire la méthode qui crée de nouvelles instances de WorkingView. Cette méthode devrait avoir le mode passé et retourner une instance de la sous-classe de béton appropriée. Par la réponse à cette question, voici ce que j'ai à ce jour :

+ (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;
}

Jusqu'à présent, si bon. Mais voici le problème. Dans la méthode init SimplifyView, je dois exécuter l'objet par la méthode init UIView. Appel [super initWithFrame: cadre] me fait seulement à WorkingView, pas tout le chemin à UIView. Je suppose que je pourrais créer un initWithFrame: méthode WorkingView qui appelle à son tour initWithFrame de UIView. Méthode - mais qui se sentent hackish

Quelle est la bonne façon de gérer cette situation?

Était-ce utile?

La solution

Si vous appelez [super initWithFrame:frame] de votre sous-classe, le moteur d'exécution grimpera la hiérarchie d'héritage à la recherche d'une classe qui implémente cette méthode, à commencer par super. Si super ne met pas en œuvre initWithFrame:, le moteur d'exécution va continuer à monter jusqu'à ce qu'il trouve finalement et appelle la mise en œuvre par défaut dans UIView.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top