2014-06-12 179 views
0

好的,如果我繼承一個類,它繼承了類的所有方法和屬性,但想象我有一堆代碼和屬性,我希望這是兩個不同的類通用的,這可能通過繼承嗎?兩個不同的類可以繼承相同的基類嗎?

例如假設一個UIViewController和一個UITableViewController。

+0

你有沒有考慮過爲基類創建一個協議,並在你想要的兩個類中實現它的相似之處? – ITGronk

+0

是的,兩個不同的類可以從同一個基類繼承。與一個類相對,只能在_Obj-C_或_Swift_中繼承一個父類。你可以玩符合相同的協議,但這不是純粹的繼承。 – holex

+0

我可以在協議.h上使用協議方法的實現嗎? – SpaceDog

回答

0

如果我理解你的問題,答案是否定的。您可以擁有儘可能多的類,只要您想從同一個類繼承,但不能從兩個類繼承類。什麼可能爲你工作是創建一個單身人士課程。我有一個實用工具類,用於尋找屏幕中點,從緩存中刪除文件,複製文件等常見操作。它有20種左右的方法,我在幾個不同的類中使用。我有我使用的一樣的系統版本,字體,文字大小,表演者姓名等

我所說的實用方法,像這樣的設置和獲取全局變量的另一個單例類:

 NSString *resultsFilePath   = [Utilities cachedFilePath:@"Results"]; 
     NSString *fullResultsFilePath  = [Utilities cachedFilePath:@"FullResults"]; 
     NSString *troublesomeWordsFilePath = [Utilities cachedFilePath:@"TroublesomeTargets"]; 

     [Utilities copyCachedResultsToFile]; 

和全局變量一樣這樣的:

if ([Globals sharedInstance].currentClient) { 
     self.clientInput.text = [Globals sharedInstance].currentClient; 
    } 

我公用事業類開始是這樣的:

// 
// 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; 
} 

我的Globals類開始是這樣的:

// 
// 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; 
} 

編輯:我使用.PCH爲默認設置爲許多我的全局的每個應用程序。例如

#define FORCED_CHOICE_SCORING NO 
#define SCORING_TYPE @"CDI" 

然後我編寫一個自定義getter,如果用戶沒有更改它,則使用默認值。

- (NSUInteger)targetSoundDelay { 

    if (!_targetSoundDelay) _targetSoundDelay = TARGET_SOUND_DELAY]; 
    return _targetSoundDelay; 
} 

- (NSString *)scoringType { 

    if (!_scoringType) _scoringType = SCORING_TYPE; 
    return _scoringType; 
} 
+2

Objective-C中不需要創建「實用工具」類 - 只需使用C函數即可實現完全全局的功能。針對特定於類的行爲使用類方法。另外,考慮使用'NSUserDefaults'的'registerDefaults:'方法來獲取全局值,比如你在'Globals'類中管理的值。 – jlehr

+0

這可以做到這一點。謝謝! – SpaceDog

+0

@jlehr我使用NSUserDefaults來保存用戶選擇的選項,但在我的情況下,我有28個應用程序使用相同的項目代碼。對我來說,通過使用全局.pch文件和每個應用程序來管理默認值會更容易。 – JScarry

相關問題