1

抱歉,问题标题有点模糊,但我发现自己很难把它弄清楚。

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

我遇到的问题是当它可能来自两个不同的类时如何定义该数据源的变量。

如果我在我的界面中定义它们:

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];

我想我一定在这里遗漏了一些明显的东西,所以感谢您提供的任何帮助

4

3 回答 3

1

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

如果这太难了,最简单的事情(我不推荐)是确保属性是idor NSObject,然后在每次访问该属性时进行类型检查。这绝对不是理想的,你不应该这样做。正确的做法是上一段。

于 2014-02-27T04:38:24.257 回答
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]])

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

于 2014-02-27T04:39:59.910 回答
1

您应该创建一个基类,并用基类继承这两个类。

@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];
}
于 2014-02-27T04:48:10.910 回答