很抱歉问题标题有点模糊,但我发现自己很难把它弄明白。
这里的问题是我可能正在初始化和加载数据的两个不同的数据源。根据数据更改,我需要哪个数据源。
我遇到的问题是,当该数据源可能来自两个不同的类时,如何定义该数据源的变量。
如果我在我的界面中定义它们:
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];
我想我一定在这里错过了一些明显的东西,所以谢谢你能提供的任何帮助
您应该创建一个基类,并使用基类继承这两个类。
@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];
}
最简单的方法是确保BColumnChartDataSource
和BDoubleColumnChartDataSource
有一个共同的超类。例如,编写一个名为 BDataSource
的超类,并确保其他两个类都是该类的子类。
如果这太难做到,最简单的事情(我不推荐)是确保属性id
或NSObject
,然后在每次访问该属性时进行类型检查。这绝对不理想,你不应该这样做。正确的做法是上一段。
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 类的实际差异。