如何定义一个可以从两个不同的类初始化的变量?

时间:2014-02-27 04:31:07

标签: ios objective-c initialization shinobi

对于稍微模糊的问题标题感到抱歉,但我发现自己很难直接理解它。

这里的问题是我有两个不同的数据源,我可能正在初始化和加载数据。取决于我需要的dataSource的数据更改。

我遇到的问题是如何定义该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语句,但是如果我添加更多的dataSource,它可能会花费更多时间。

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

我想我必须遗漏一些明显的东西,所以谢谢你能给予的任何帮助

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:1)

最简单的方法是确保BColumnChartDataSourceBDoubleColumnChartDataSource有一个共同的超类。例如,编写一个名为BDataSource的超类,并确保其他类都是此类的子类。

如果这样做太难了,最容易做的事情(我不推荐)是确保属性为idNSObject,然后每次都进行类型检查你进入该物业。这绝对不是理想的,你不应该这样做。正确的做法是上一段。

答案 2 :(得分: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]])

的结果自行调整

在继承&#34;的概念中可能会找到更好的模式,具体取决于两个dataSource类的实际差异。