如何从父类继承属性并覆盖setter和getter的最佳实践

时间:2015-04-11 02:46:00

标签: ios objective-c

我试图用继承样式重构我的项目代码,如何从父类继承属性并覆盖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

1 个答案:

答案 0 :(得分:0)

从技术上讲,实施LineChartViewController时唯一需要的是:

@dynamic dataModel;

告诉编译器将以某种方式提供getter和setter,它不能立即看到。实际上,它们将由超类提供。

但是,这会产生问题。 LineChartViewController是一个ChartViewController。这意味着LineChartViewController的实例可以传递给声明为ChartViewController的方法或函数,并且该方法/函数有权对​​{的接口允许做任何事情。 {1}}。这包括将ChartViewController(不是ChartModel)的实例分配给其LineChartModel属性。据推测,如果dataModel属性不是LineChartViewController,则dataModel会中断。

在技术方面,您的设计违反了Liskov substitution principle

它不是解决设计问题的方法,但如果发生问题,你可以在运行时发现问题,方法是实现这样的setter覆盖:

LineChartModel