2014-02-27 60 views
1

不好意思的問題標題略顯模糊,但我發現很難直接在我的腦海中找到它。如何定義可以從兩個不同類初始化的變量?

這裏的問題是我有兩個不同的數據源,我可能會初始化和加載數據。取決於我需要的dataSource的數據更改。

我遇到的問題是如何定義該數據源的變量,當它可能來自兩個不同的類。

如果我在接口定義它們:

BColumnChartDataSource * chartDatasource = [[BColumnChartDataSource alloc] initWithExercise:_exercise]; 
BDoubleColumnChartDataSource * chartDatasource = [[BDoubleColumnChartDataSource alloc] initWithExercise:_exercise]; 

然後,它顯然不喜歡他們被稱爲同樣的事情。

如果我試圖把它們放在if語句然後他們不是可用的邏輯語句

if (_exercise.unitTypeLinks.count < 2) { 
    BColumnChartDataSource * chartDatasource = [[BColumnChartDataSource alloc] initWithExercise:_exercise]; 
    } 
else { 
    BDoubleColumnChartDataSource * chartDatasource = [[BDoubleColumnChartDataSource alloc] initWithExercise:_exercise]; 
} 

最後,我想將它們放到這樣的語句之外,所以我可以if語句到把一個其中每一個,但它是一個非常詳細的方式,如果我添加更多的數據源可能需要更多的時間。

// Get the exercise event list for our clicked exercise 
_exerciseEventList = [chartDatasource getExerciseEventList]; 

我想我必須在這裏失去了一些東西很明顯,所以,謝謝您的幫助,你可以給

+0

'ID chartDatasource'好像這裏顯而易見的解決方案。不過,這取決於兩個類別的運作方式。 – farski

+0

chartDatasources非常相似 - 只是對圖表稍作調整 - 如何在代碼中使用id ChartDatasource?只是把它放在頂部? –

+0

BColumnChartDataSource和BDoubleColumnChartDataSource是2個類,具體取決於您需要從該類獲取信息的滿足程度(在許多控制器中您將得到這種情況),這是您的問題 –

回答

1

最簡單的方法是確保BColumnChartDataSourceBDoubleColumnChartDataSource有一個共同的超類。例如,編寫一個名爲BDataSource的超類,並確保兩個其他類都是此類的子類。

如果這樣做太難了,最簡單的事情(我不推薦)是確保屬性是idNSObject,然後在每次訪問屬性時都進行類型檢查。這絕對不是理想的,你不應該這樣做。正確的做法是前一段。

1
NSObject *chartDataSource; 
if (_exercise.unitTypeLinks.count < 2) { 
    chartDataSource = [[BColumnChartDataSource alloc] initWithExercise:_exercise]; 
} 
else { 
    chartDataSource = [[BDoubleColumnChartDataSource alloc] initWithExercise:_exercise]; 
} 
//Now do something with chartDataSource 

來處理你所描述的具體例子,但它留下了不少有待改進下游消費者chartDataSource的將可能有根據的([chartDataSource isKindOfClass:[BColumnChartDataSource class]])

更好的模式的結果做自己的調理有可能可以在「繼承」的概念中找到,這取決於你的兩個數據源類實際的差異。

3

您應該創建一個基類,然後繼承這兩個類與基類。

@interface BDataSource : NSObject 
@end 

@interface BColumnChartDataSource : BDataSource 
//your custom implementation here 
@end 

@interface BDoubleColumnChartDataSource : BDataSource 
//your custom implementation here 
@end 

之後,你可以初始化你的數據源這樣

BDataSource *dataSource = nil; 
if (_exercise.unitTypeLinks.count < 2) { 
dataSource = [[BColumnChartDataSource alloc]  initWithExercise:_exercise]; 
} 
else { 
dataSource = [[BDoubleColumnChartDataSource alloc] initWithExercise:_exercise]; 
}