2012-02-11 34 views
1

如果我有一個超類與便捷構造如下(使用ARC):子類方便construtctor

+(id)classA { 
    ClassA *foo = [[ClassA alloc] init]; 

    return foo; 
} 

如果我再繼承ClassA的,有一個名爲ClassB類的,我想覆蓋便捷構造,如下正確:

+(id)classB { 
    ClassB *foo = [ClassA classA]; 

    return foo; 
} 


(假設我不能打電話的alloc和init上ClassB的)。

謝謝!

回答

2

不,這是不正確的,因爲它分配,入口和返回一個ClassA,而不是一個ClassB。要做到這一點的唯一方法是不明確使用ClassA的:

+ (id) classA 
{ 
    return [[self alloc] init]; 
} 

當然,你也可以使用老式的new此:

ClassB *myB = [ClassB new]; 

FWIW,假設我希望做的更多不僅僅是分配和初始化,我的類名爲小工具,那麼我會做這樣的事情:

+ (id) gadgetWithNumber: (int) num 
{ 
    return [[self alloc] initWithNumber: num]; 
    // or without ARC: 
    // return [[[self alloc] initWithNumber: num] autorelease]; 
} 

當然,這假設有在我的課的initWithNumber:方法。

+0

你將如何去繼承UIButton的子類。我已經看到很多人繼承子類,並且在構造函數中他們執行類似於'MyBtnClass * myBtn = [MyBtnClass buttonWithType:UIButtonTypeCustom]' – 2012-02-11 22:28:45

+0

好吧,如果您調用這樣的「構造函數」,Objective-C將返回正確的類型的UIButton。但是,它的工作方式不同看我的編輯。 – 2012-02-11 23:31:43

+0

@RudyVelthuis - 良好的編輯;-)「老式」? – CRD 2012-02-12 02:57:05

3

類方法就像實例方法一樣通過self,只有在類方法的情況下,self的值是Class的實例。因此,改變你的classA方法:。

+ (id) classA 
{ 
    return [[self alloc] init]; 
} 

(這只是你NSObject繼承的new定義的約定是newX回報留存參考,而classnameX返回一個自動釋放參考使用ARC的差別實在是沒有實際意義,但我會用newX自己去了。)

現在,如果ClassB是一個子類的ClassA然後[ClassB classA]將調用classAselfClassB會讓你allocinit a ClassB實例。