2010-08-22 68 views
0

我正在做一個類來初始化某些類的實例。這個類將被用來初始化幾個不同類的類,它們都是從一個普通的超類中分類出來的。目前我正在使用一個實例變量:我可以爲類類型變量指定特定的超類需求嗎?

Class templateClass; 

存儲類的類型。我得到編譯器警告,說templateClass不支持方法。有沒有辦法抑制這些警告或指定模板類必須是某個類的子類?
此外,這是在objective-c中執行此操作的理想方法嗎?有沒有不同的方式來指定我應該使用的類?
感謝您的幫助!

編輯: 我寫的這個類是爲了在隨機選擇的位置創建精靈並用一些變量來限制它們。這個類期望它激發的類有一個initWithX:(int)pos yVariance:(int)variance方法。我期望這可以使用你提到的協議來定義。我將爲每個我必須創建的精靈類型創建rezzing類的多個實例。我希望能夠發送重新分類initWithTemplateClass:(Class)templateClass來定義要創建的精靈的類型。我不確定這是否是正確的方法,但是因爲編譯器發佈方法initWithX:(int)pos yVariance:(int)variance不適用於templateClass。我期待着我正在處理這個問題。 顯示這條警告的代碼是:

[self addChild:[[templateClass alloc] initWithX:positionOfChild 
    yVariance:(random()%(rowVarianceSize+1))]]; 
+0

也許你應該發佈一些代碼,顯示你如何使用'templateClass'生成警告。 – imaginaryboy 2010-08-22 23:42:01

+0

剛剛添加了代碼 – dhatch387 2010-08-23 00:04:24

回答

1

編輯添加第二個替代

我不明白的是警告(我也沒有想到)當我編譯試圖做你在做什麼,一個簡單的測試用例。

這就是說,你在做什麼似乎完全合理。儘管在'addChild'示例中確實存在泄漏。你分配/初始化你的新對象,留下它的保留計數爲1,然後(假設'self'是一個UIView),你對addChild的調用也會保留這個對象,但是你沒有你自己的引用來釋放。

id obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]]; 
[self addChild:obj]; 
[obj release], obj = nil; 

此外,普京的建議,定義一個協議是一個很好的,如果你這樣做,你甚至可以插入一個運行時檢查templateClass給您提供符合該協議。

if ([templateClass conformsToProtocol:@protocol(Foo)]) { 
    id<Foo> obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]]; 
    [self addChild:obj]; 
    [obj release], obj = nil; 
} else { 
    // Do whatever you want to do if templateClass isn't correct. 
    // Obviously you could also have the protocol conformance check elsewhere. 
} 

然而,作爲替代品所有這一切,而不是用類的實例變量,你可以定義爲,創造您想要精靈的特定類型的工廠對象的接口。然後傳入適當的工廠類實例。

例如:

@interface Sprite : UIView { 
} 
- (id)initWithX:(int)pos yVariance:(int)variance; 
@end 

@interface SpriteFactory { 
} 
- (Sprite*)createSprite; 
@end 

然後創建對亞類:一個Sprite子類,並且這產生那種精靈的SpriteFactory子類。

然後,而不是使用您的'類templateClass',你會有一個'SpriteFactory *工廠',而不是。

+0

非常感謝! – dhatch387 2010-08-23 01:08:14

4

您可以定義在它所有需要的方法protocol。然後聲明你的類符合該協議。

+0

我需要讓照顧初始化的類知道要初始化哪種類型。有沒有更好的方法來做到這一點,然後使用'Class'類型來存儲它? – dhatch387 2010-08-22 22:59:38

+0

我正在做一個遊戲,一個班級照顧rezzing sprites。我想用它來rez多種類型的精靈,但我不確定是否使用Class類型是定義哪種精靈類型的正確方法。精靈是一個超類的所有不同的子類。 – dhatch387 2010-08-22 23:01:49

+0

對不起,我的回答並不完全是你需要的......你可以給你更多的信息,你想如何創建你的精靈,你如何通過類型的精靈...... – Vladimir 2010-08-22 23:20:40

相關問題