2013-07-31 27 views
1

我有我的Xcode項目可以編譯兩個目標,爲了簡單起見,我們將其稱爲'Foo'和'Bar'。我有一個超類和兩個子類,我怎樣才能乾淨地確保一個變量作爲基於項目目標的不同子類返回?基於Xcode項目目標的Objective-C返回子類?

因此,例如,說我有以下...

ViewManager.h //Super Class 
FooViewManager.h //Foo Subclass 
BarViewManager.h //Bar Subclass 

... 

ViewManager * viewManager; 

#if Target_Foo 

    viewManager = [[FooViewManager alloc] init]; 

#elif Target_Bar 

    viewManager = [[BarViewManager alloc] init]; 

#else 

    viewManager = [[ViewManager alloc] init]; 

#endif 

... 

有什麼辦法,我可以使此代碼更清潔,所以在調用者類我不需要所有的編譯器#if聲明,我只需要初始化超類,也許超類初始化方法可以根據當前項目目標來切換,並返回我的viewManager變量中正確的子類?

我敢肯定,Objective-C中可能存在一個標準模式,我錯過了,但任何幫助將不勝感激!

回答

2

這是有可能找到所需的子類定義在一個地方,即,你可以做一次定義,並用它遍佈地方:

#if defined(Target_Foo) 
    #define CurrentViewManager FooViewManager 
#elif defined(Target_Bar) 
    #define CurrentViewManager BarViewManager 
#else 
    #define CurrentViewManager ViewManager 
#endif 

,然後只用這個新的無處不在確定無預處理宏:

CurrentViewManager *manager = [[CurrentViewManager alloc] init]; 

也許你會發現它有用在一些織物的方法incapsulate這樣的邏輯:

+ (ViewManager *)createViewManager 
{ 
    // Preprocessor switches would be here 
    // ... 

    return [[CurrentViewManager alloc] init]; 
} 
1

您可以創建2個相同名稱的類並將m個資源文件分配給不同的目標。這樣你可以在h文件中聲明一個通用類型,但是在編譯器的引擎下,編譯器會使用2個不同的源文件來實現它。

+0

是的,這是一種可能性,但是這不允許我有一個默認實現的'SuperClass',並且只覆蓋該類中的特定方法。即使在其中一個「目標」類中只需要很小的改變,也需要重複整個班級代碼。 – Sammio2

+1

您可以在兩個目標上生成超類,並在單個目標上生成子類 –