Classe initialisation du cluster
-
01-10-2019 - |
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?
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.