我试图用继承样式重构我的项目代码,如何从父类继承属性并覆盖setter和getter的最佳实践是什么?
我给出了演示代码,在演示中,ChartModel是ChartViewController中的基类,而LineChartModel是LineChartViewController中ChartModel的子类。
我想在子视图控制器中覆盖LineChartModel *dataModel
的setter和getter。请包含任何@synthesize和受保护的实例变量,或者如果它是由编译器自动生成的,请标记。提前谢谢。
// ChartModel.h
@interface ChartModel : NSObject
-(BOOL)hasData;
@end
// LineChartModel.h
@interface LineChartModel : chartModel
-(void)getLineColor;
@property (nonatomic, strong) NSArray* dataArray;
@end
// ChartViewController.h
@interface ChartViewController: UIViewController
@property (nonatomic, strong) ChartModel *dataModel;
-(void)updateUI;
@end
// ChartViewController.m
@implementation ChartViewController
-(void)updateUI {
if ([self.dataModel hasData]) {
[self.view setHidden:NO];
} else {
self.view.hidden = YES;
}
// setter and getter here
@end
// LineChartViewController.h
@interface LineChartViewController : ChartViewController
// pay attension here, same name but a sub class of chartModel
@property (nonatomic, strong) LineChartModel *dataModel;
@end
// LineChartViewController.m
@implementation LineChartViewController
//override dataModel setter here
//override dataModel getter here
@end
答案 0 :(得分:0)
从技术上讲,实施LineChartViewController
时唯一需要的是:
@dynamic dataModel;
告诉编译器将以某种方式提供getter和setter,它不能立即看到。实际上,它们将由超类提供。
但是,这会产生问题。 LineChartViewController
是一个ChartViewController
。这意味着LineChartViewController
的实例可以传递给声明为ChartViewController
的方法或函数,并且该方法/函数有权对{的接口允许做任何事情。 {1}}。这包括将ChartViewController
(不是ChartModel
)的实例分配给其LineChartModel
属性。据推测,如果dataModel
属性不是LineChartViewController
,则dataModel
会中断。
在技术方面,您的设计违反了Liskov substitution principle。
它不是解决设计问题的方法,但如果发生问题,你可以在运行时发现问题,方法是实现这样的setter覆盖:
LineChartModel