2010-06-07 143 views
0

我有幾個類有差不多相同的代碼。它們之間只有一個或兩個字符串是不同的。我想要做的是從另一個定義這些函數的類中使它們成爲「x」,然後使用常量或其他來定義那些不同的字符串。我不確定是否「x」是繼承或擴展或什麼。這是我需要幫助的。Objective-C協議vs繼承與擴展?

例如:

objectA.m:

-(void)helloWorld { 
    NSLog("Hello %@",child.name); 
} 

objectBob.m:

#define name @"Bob" 

objectJoe.m

#define name @"Joe" 

(我不知道定義字符串是合法的,但這會得到結果e point across)

如果objectBob.m和objectJoe.m不需要定義方法,那麼它們將是理想的,只是它們與objectA.m的關係。有沒有辦法做這樣的事情?它有點像協議,除了相反,我想要「協議」來實際定義函數。


如果一切都失敗我就做objectA.m:

-(void)helloWorld:(NSString *name) { 
    NSLog("Hello %@",name); 
} 

而且具有其他文件調用該函數(只是#import objectA.m)。

回答

2

只需在您的子類中創建一個-name方法(您需要一個基類,然後是每個類型的子類)。

然後做:

- (void)helloWorld { 
    NSLog(@"hello %@", [self name]); 
} 

編輯:固定的非objc樣方法命名。 再次編輯:固定方法。

+0

+1除了它將通過可可命名標準調用「名稱」。 – 2010-06-07 22:03:33

+0

Objective-C getter方法不使用單詞get。這只是'[自己的名字]'。以'get'開頭的方法表明某個提供的緩衝區正在填充或正在獲取遠程資源。 – Chuck 2010-06-07 22:04:31

+0

這看起來會很好。可以/我應該將它與一個定義基類所需函數的協議(如名稱)結合起來?實際上,「名稱」是否需要成爲一種方法,或者有沒有辦法使它成爲子類的常量? – RyanJM 2010-06-07 22:27:29

0

聽起來像繼承給我。將helloWorld方法定義爲NSLog(@"Hello %@", name),並讓子類爲它們的name實例變量提供不同的值。 (請注意,我正在討論實例變量,而不是預處理器宏,因此無法用於此目的。)

+0

有沒有什麼辦法擺脫實例變量並使其可用於類方法?或者唯一的方法就是像chpwn一樣調用方法嗎? – RyanJM 2010-06-07 22:30:54

+0

方法和實例變量是按類自定義行爲的唯一方法。爲什麼你不喜歡使用方法調用? – Chuck 2010-06-07 23:12:14