2013-08-15 3 views
0

Je pose cette question pour voir si ma compréhension du fonctionnement de l'orientation objet est correcte. Disons que j'ai une super classe abstraite qui a plusieurs méthodes avec une sorte de mise en œuvre.Concept correct pour la programmation orientée objet

@interface SuperClass : UIViewController 
- (void)methodOne; 

// Other public stuff 


@end 

.......

@implementation SuperClass 

- (void)methodOne 
{ 
    //some implementation 
} 

- (someObject *)objectMethod 
{ 
    //more implementation 
} 

@end 

Alors si je suis une sous-classe de la mise en œuvre que:

@interface SubClass : SuperClass 

@end 

.......

@implementation SubClass 

- (void)methodOne 
{ 
    // override method implementation code 
} 

@end 

Donc, à partir de l'exemple ci-dessus, si je crée un contrôleur de vue, qui est une classe de SubCl ass, va-t-il essentiellement créer un objet SubClass et ajouter automatiquement l'implémentation de toutes les méthodes SuperClass? L'idée que je me fais est que si le préprocesseur s'exécute, prend-il une méthode qui n'a pas été surchargée dans la sous-classe et place juste la méthode du code super classe dans cette classe pour son utilisation? Dans ce cas, je ne remplace que la méthode 'methodOne' de la super classe et laisse la méthode 'objectMethod' seule. Cela signifie-t-il que ma SubClass utilisera la nouvelle implémentation 'methodOne' surchargée et utilisera l'implémentation 'objectMethod' des SuperClasses?

Merci beaucoup! Faites-moi savoir si je dois clarifier quelque chose.

Répondre

3

Si vous redéfinissez methodOne dans l'implémentation SubClass, les instances de SubClass utiliseront l'implémentation redéfinie. S'il n'y a pas de redéfinition de l'implémentation SubClass, l'implémentation de SuperClass sera utilisée pour une définition. Ce processus continue récursivement à travers les super classes supérieures jusqu'à ce qu'il trouve une définition.

Si vous souhaitez modifier légèrement la définition dans le SubClass, vous pourriez faire quelque chose comme:

-(void) methodOne{ 
    // Some code to add before SuperClass's implementation is called 
    .... 

    // Call SuperClass's implementation 
    [super methodOne]; 

    // Some code to add after SuperClass's implementation is called 
    ... 
} 
+0

Merci beaucoup! Cela clarifie vraiment les choses pour moi. J'ai également posté un commentaire ci-dessous à une question connexe. Si vous aviez un aperçu supplémentaire à ce sujet, je l'apprécierais grandement aussi! Merci encore! – Jonathan

1

Oui. La sous-classe obtient toutes les méthodes des superclasses. Si vous en substituez un, cette méthode n'a plus l'implémentation de superclasses. Dans ce cas, vous obtiendrez le objectMethod de la superclasse et le methodOne de la sous-classe lorsque vous instanciez une instance de sous-classe et appelez l'une ou l'autre des méthodes.

+0

Impressionnant! Je suis heureux de voir que ma compréhension est correcte. Une autre chose que j'ai du mal à utiliser est l'utilisation de variables de ma superclasse dans ma sous-classe. Dans mon exemple spécifique, je crée un jeu et SuperClass est le jeu et c'est là que le jeu est instancié comme une propriété. My SubClass doit remplacer les méthodes qui utilisent le même objet de propriété, mais je n'y ai évidemment pas accès. Je ne peux pas non plus rendre cette propriété publique. Comment puis-je fournir un remplacement qui nécessite l'accès à une autre propriété de classes? Je ne peux pas utiliser la délégation pour cela non plus. – Jonathan

+0

Je pense qu'il y a deux solutions à ce problème: 1) Rendre la propriété publique. Mais puisque vous avez dit que vous ne pouvez pas faire cela ... 2) Faire une sorte de méthode dans la superclasse que la sous-classe peut appeler en utilisant self qui obtiendra les données pertinentes dont vous avez besoin hors des propriétés privées ... alors disons vous avoir int x et int y et vous ne voulez pas les exposer, mais vous avez besoin de x + y, écrire une méthode publique - (NSInteger) xplusy qui fait le calcul et le retourne, et qui devrait être disponible à utiliser dans la sous-classe ... ou vous savez - (NSInteger) x si vous vouliez juste x. – AdamG

Questions connexes