Ok, Si je sous-classe une classe, elle hérite de toutes les méthodes et propriétés de cette classe mais imagine que j'ai un tas de code et de propriétés et que je veux que ce soit commun à deux classes différentes. Par exemple, supposons un UIViewController et un UITableViewController.Deux classes différentes peuvent-elles hériter de la même base?
Répondre
Si je comprends votre question, la réponse est non. Vous pouvez avoir autant de classes que vous voulez hériter de la même classe, mais vous ne pouvez pas avoir une classe héritant de deux classes. Ce qui pourrait fonctionner pour vous est de créer une classe singleton. J'ai une classe utilitaires que j'utilise pour des opérations courantes comme trouver le milieu de l'écran, supprimer des fichiers du cache, copier des fichiers, etc. Il y a une vingtaine de méthodes que j'utilise dans plusieurs classes différentes. J'ai une autre classe singleton J'utilise pour définir et obtenir des variables globales comme la version du système, les polices, la taille du texte, le nom du joueur, etc.
j'appelle les méthodes utilitaires comme ceci:
NSString *resultsFilePath = [Utilities cachedFilePath:@"Results"];
NSString *fullResultsFilePath = [Utilities cachedFilePath:@"FullResults"];
NSString *troublesomeWordsFilePath = [Utilities cachedFilePath:@"TroublesomeTargets"];
[Utilities copyCachedResultsToFile];
et les variables globales comme ceci:
if ([Globals sharedInstance].currentClient) {
self.clientInput.text = [Globals sharedInstance].currentClient;
}
Ma classe Utilitaires commence comme ceci:
//
// Utilities.m
//
// Created by John Scarry on 11/3/11.
// Copyright (c) 2011 Learning Fundamentals, Inc. All rights reserved.
//
#import "Utilities.h"
#import "mach/mach.h"
@implementation Utilities
+ (CGPoint)findMidpoint:(UIView *)view {
CGPoint midPoint;
midPoint.x = view.bounds.origin.x + view.bounds.size.width/2;
midPoint.y = view.bounds.origin.y + view.bounds.size.height/2;
return midPoint;
}
+ (NSString *)formattedDate {
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSString *todaysDate = [dateFormatter stringFromDate:[NSDate date]];
return todaysDate;
}
+ (NSString *)formattedClientName {
NSString *client = [NSString stringWithFormat:@" "];
if([Globals sharedInstance].currentClient) client = [NSString stringWithFormat:@" %@ ",[Globals sharedInstance].currentClient];
return client;
}
Et ma classe Globals commence comme ceci:
//
// Globals.m
//
// Created by John Scarry on 11/3/11.
// Copyright (c) 2011 Learning Fundamentals, Inc. All rights reserved.
//
#import "Globals.h"
@implementation Globals
static Globals *singleton = nil;
+(Globals *) sharedInstance {
if (nil != singleton) return singleton;
static dispatch_once_t onceToken; // lock
dispatch_once(&onceToken, ^{ // this code is called at most once
singleton = [[Globals alloc] init];
});
return singleton;
}
// Lots of the properties use a default value from the .pch file
// Use lazy instantiation to overide the getter to make sure it is set.
- (NSInteger) systemVersionNumber {
return [[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue];
}
- (NSString *)scoringType {
if (!_scoringType) _scoringType = SCORING_TYPE;
return _scoringType;
}
- (NSString *)targetSoundDelayCode {
if (!_targetSoundDelayCode) _targetSoundDelayCode = TARGET_SOUND_DELAY;
return _targetSoundDelayCode;
}
- (BOOL)checkBoxes {
if (!_checkBoxes) _checkBoxes = FORCED_CHOICE_SCORING;
return _checkBoxes;
}
- (BOOL)showFavorites {
if (! _showFavorites) _showFavorites = NO;
return _showFavorites;
}
Edit: J'utilise un .pch pour chaque application qui définit les valeurs par défaut pour beaucoup de mes globals. par exemple.
#define FORCED_CHOICE_SCORING NO
#define SCORING_TYPE @"CDI"
Puis j'écrire un getter personnalisé qui utilise la valeur par défaut si l'utilisateur n'a pas changé.
- (NSUInteger)targetSoundDelay {
if (!_targetSoundDelay) _targetSoundDelay = TARGET_SOUND_DELAY];
return _targetSoundDelay;
}
- (NSString *)scoringType {
if (!_scoringType) _scoringType = SCORING_TYPE;
return _scoringType;
}
Il n'est pas nécessaire de créer des classes 'Utilities' dans Objective-C - il suffit d'utiliser les fonctions C pour implémenter des fonctionnalités complètement globales. Utilisez les méthodes de classe pour le comportement spécifique à la classe. En outre, pensez à utiliser la méthode 'registerDefaults:' de 'NSUserDefaults' pour les valeurs globales telles que celles que vous gérez dans votre classe' Globals'. – jlehr
cela peut faire l'affaire. MERCI! – SpaceDog
@jlehr J'utilise NSUserDefaults pour enregistrer les options sélectionnées par l'utilisateur, mais dans mon cas, j'ai 28 applications qui utilisent le même code de projet. Pour moi, il est beaucoup plus facile de gérer les valeurs par défaut en utilisant un fichier .pch global et un pour chaque application. – JScarry
- 1. Hériter de deux classes Java
- 2. Comment peut-on hériter de deux classes au même niveau?
- 3. Référencement de la même variable dans deux classes différentes
- 4. Accès à la même fonction de deux classes différentes
- 5. Deux applications Java différentes partageant la même base de données
- 6. Appel de constructeurs de différentes classes implémentant la même interface et dérivés de la même base?
- 7. Utilisation du même objet dans deux classes différentes
- 8. Deux classes Java dans la même vue
- 9. Comment hériter des propriétés de deux classes dans une classe?
- 10. Comment hériter de plusieurs classes de base en Java?
- 11. Itération à travers deux listes de deux classes héritées (de la même classe de base)
- 12. Héritage de deux classes différentes objectif c
- 13. La surcharge est-elle possible dans deux classes différentes
- 14. C# routine de filtrage unique pour la liste des deux classes différentes par la même propriété
- 15. Réduction de la duplication de code dans deux classes ayant des classes imbriquées différentes
- 16. Unity - Injecter différentes classes pour la même interface
- 17. Même code faisant deux choses différentes sur deux applications différentes?
- 18. Deux transactions différentes mettant à jour différentes lignes de la même table en même temps
- 19. Simplifier même css pour plusieurs classes différentes?
- 20. OO question simple ... importer la même bibliothèque de différentes classes
- 21. Accéder à la même liste d'itérateurs de différentes classes
- 22. Même attribut pour 4 classes différentes
- 23. Hériter des classes sans destructeurs virtuels
- 24. Comment inclure deux en-têtes différents contenant deux classes différentes portant le même nom?
- 25. Commutation entre deux classes différentes jQuery
- 26. Diffusion d'objets de différentes classes mais de même type
- 27. @OneToMany dans différentes classes pointant vers la même entité
- 28. Guice reliant deux classes différentes à la même interface avec l'annotation
- 29. détection de collision de deux objets dans différentes classes
- 30. Hériter d'une classe de base
Avez-vous envisagé de créer un protocole pour une classe de base et de l'implémenter sur les deux classes pour lesquelles vous voulez avoir des similitudes? – ITGronk
Oui, deux classes différentes peuvent être héritées de la même classe de base. l'inverse d'une classe peut être hérité d'un seul parent dans _Obj-C_ ou _Swift_. vous pouvez jouer avec les mêmes protocoles conformes mais ce n'est pas l'héritage purement. – holex
Puis-je avoir l'implémentation de la méthode du protocole sur le protocole .h? – SpaceDog