2012-05-19 43 views
0

我有一個叫做City的超類,還有一些繼承自這個類的子類。例如倫敦和紐約。這些子類中的每一個都有自己獨特的方法和實例變量。目標C創建動態對象的策略

當我的應用程序啓動我地理編碼當前位置,並根據實例子類在哪個城市我現在願意加入,

現在我有多個屬性定義訪問這些類,所以

@property (nonatomic, strong) London *london; 
@property (nonatomic, strong) NewYork *newYork; 
... 
... 

我只會在任何時候需要一個此類型的對象,所以只會定義一個用於訪問此對象的屬性。像

@property (nonatomic, strong) City *city; 

有沒有辦法可以動態創建我需要的子類而不必聲明多個屬性?

+8

你有'倫敦'和'紐約'的課程有點令人擔憂。爲什麼你需要專門的子類?爲什麼不是一個通用的'City'類,然後可以查詢(類似於字典,也許?)以獲取特定信息? –

+0

@DaveDeLong +1他到那裏聽起來像是一個可怕的設計模式。 –

+0

@DaveDeLong我認爲子類化在這裏效果最好,因爲每個城市都有自己獨特的實例變量和方法,只適用於特定的城市。對於人口,地塊等通用事物,這些都是從超類繼承而來。 – KJF

回答

2

你絕對可以實現在Objective-C的子類。你可以做下面的實例化一個城市:

self.city = [[NewYork alloc] init]; 

要調用特定城市的方法:

if ([self.city isKindOfClass:[NewYork class]]) 
{ 
     // call some NewYork methods e.g.. 
     [(NewYork *)self.city doNewYorkThing]; 
} 
else if ([self.city isKindOfClass:[London class]]) 
{ 
     // call some London methods e.g. 
     [(London *)self.city doLondonThing]; 
} 

的方法 「isKindOfClass:」, 「isMemberOfClass:」, 「conformsToProtocol:」 和「respondsToSelector :「是你熟悉的有用的類方法。

+1

旁註:調用特定於子類的方法時,會得到編譯器警告,除非轉換爲子類或'id'。 – andyvn22

1

「動態」是一個靈活的概念。 :)你當然可以寫類似...

self.city = [[London alloc] init]; 

...然後使用城市定義的任何方法。如果倫敦定義了它自己的實現,你將得到這些方法的重寫版本。如果你真的,真的知道這是一個倫敦的對象,你也可以這樣做:

[(London *)city somethingSpecial];