2014-06-12 2 views
0

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?

+0

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

+0

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

+0

Puis-je avoir l'implémentation de la méthode du protocole sur le protocole .h? – SpaceDog

Répondre

0

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

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

+0

cela peut faire l'affaire. MERCI! – SpaceDog

+0

@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

Questions connexes