好的,如果我繼承一個類,它繼承了類的所有方法和屬性,但想象我有一堆代碼和屬性,我希望這是兩個不同的類通用的,這可能通過繼承嗎?兩個不同的類可以繼承相同的基類嗎?
例如假設一個UIViewController和一個UITableViewController。
好的,如果我繼承一個類,它繼承了類的所有方法和屬性,但想象我有一堆代碼和屬性,我希望這是兩個不同的類通用的,這可能通過繼承嗎?兩個不同的類可以繼承相同的基類嗎?
例如假設一個UIViewController和一個UITableViewController。
如果我理解你的問題,答案是否定的。您可以擁有儘可能多的類,只要您想從同一個類繼承,但不能從兩個類繼承類。什麼可能爲你工作是創建一個單身人士課程。我有一個實用工具類,用於尋找屏幕中點,從緩存中刪除文件,複製文件等常見操作。它有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;
}
你有沒有考慮過爲基類創建一個協議,並在你想要的兩個類中實現它的相似之處? – ITGronk
是的,兩個不同的類可以從同一個基類繼承。與一個類相對,只能在_Obj-C_或_Swift_中繼承一個父類。你可以玩符合相同的協議,但這不是純粹的繼承。 – holex
我可以在協議.h上使用協議方法的實現嗎? – SpaceDog