2012-04-25 40 views
3

我有一個關於子類和類方法的問題。子類Objective C類方法

我有具有一個方便的類方法

+ (id)giveMeAClassUsing:(NSString *)someParameter;

MyBaseClass不是一個單基類MyBaseClass

現在,我想創建一個MyBaseClass的子類,我們稱它爲MyChildClass。我希望在MyChildClass上也有相同的分類方法。另外,當我這樣做時,我也希望初始化一個實例變量MyChildClass

會做這樣的事情:

+ (id)giveMeAClassUsing:(NSString *)someParameter { 

     MyChildClass *anInstance = [super giveMeAClassUsing:someParameter]; 
     anInstance.instanceVariable = [[UIImageView alloc] initWithFrame:someFrame]; 

     return anInstance; 
} 

有效嗎?

感謝您的所有幫助(提前),並解決我的困惑和澄清一些概念!

乾杯!

+0

是的;這是真正的*類方法*和*靜態方法*之間的關鍵區別。... – bbum 2012-04-25 23:10:29

回答

6

這將工作正常。

可能更好的將是,你不需要來覆蓋它這樣的方式來定義你的便捷構造:

+ (id)myClassWithString: (NSString *)string { 
    return [[[self alloc] initWithString:string] autorelease]; 
} 

這將做正確的事情無論哪個超類或任何的它的子類中它被稱爲在

然後在你的僅更改initWithString:方法來處理初始化:

- (id)initWithString: (NSString *)string { 
    return [self initWithString:string andImageView:[[[UIImageView alloc] initWithFrame:someFrame] autorelease]] ; 
} 
+0

您是否善良以澄清這一點多一點?我當前的基類實現是:'+(id)giveMeAClassUsing:(NSString *)someParameter {BaseClass * anInstance = [[self alloc] initUsingCustomInstanceMethod:aParameter]; return anInstance;}'所以,我只需要在我的子類中重寫'initUsingCustomInstanceMethod:aParameter'? – codeBearer 2012-04-25 18:56:27

+0

這就是我所說的,是的。你擁有它的方式也可以正常工作,但是當我閱讀你的代碼時,我可能會期望只有'init ...'方法被覆蓋。 – 2012-04-25 18:57:42

+0

棒極了。你是對的!!!它完全跳過了我的想法,我將引用'[ChildClass giveMeAClassUsing:aParameter]',因爲調用'[self alloc]'的baseClass的代碼實際上是指ChildClass。然後,我調用'[super initUsingCustomInstanceMethod:aParameter]'並執行我的自定義初始化。 :D謝謝! – codeBearer 2012-04-25 19:05:37

5

絕對有效。

雖然在超類中有一點需要注意,但請參考類self而不是按名稱的超類。

這是不好:

// MySuperClass // BAD :(
+ (id)giveMeAClassUsing:(NSString *)someParameter { 
    return [[[MySuperClass alloc] initWithParam:someParameter] autorelease]; 
} 

但是,這是很好的!

// MySuperClass // GOOD! :D 
+ (id)giveMeAClassUsing:(NSString *)someParameter { 
    return [[[self alloc] initWithParam:someParameter] autorelease]; 
} 

否則,當你的子類,然後調用超級,你實際上並沒有初始化正確的類。使用self允許實例化類而不重寫類方法。

+0

是的,是的。正如上面的註釋中所發佈的,這就是我如何初始化我的superClass:'+(id)giveMeAClassUsing:(NSString *)someParameter {BaseClass * anInstance = [[self alloc] initUsingCustomInstanceMethod:aParameter]; return anInstance;}' – codeBearer 2012-04-25 18:57:14

+0

謝謝,儘快回覆和建議。 :) – codeBearer 2012-04-25 18:58:04