用block 代替类继承实现方法的多态性重构技巧分享
来源:互联网 发布:局部二值模式算法 编辑:程序博客网 时间:2024/06/07 02:46
源起
以类继承方式实现方法的多态方式,在项目中发现用起来比较麻烦
1. 文件量增加了,每一个多态个体需要两个文件来承载,一个.h一个.m,造成项目中文件量大增,增加代码管理维护成本。
2. 在每次使用时,需要写很多代码,开发速度受到影响,不断重构,提高代码复用,持续降低开发成本是目标。
实现方式
增加一个目标类的子类以实现block化,在需要实现多态的方法处回调block
例子
.h
@interface ModelStatusInfoB : ModelStatusInfo@property(nonatomic,strong)NSString * (^titleForEmptyBlock)(void);@property(nonatomic,strong)NSString * (^subTitleForEmptyBlock)(void);@property(nonatomic,strong)NSString * (^titleForErrorBlock)(NSError *error);@property(nonatomic,strong)NSString * (^subTitleForErrorBlock)(NSError *error);@property(nonatomic,strong)NSString * (^actionButtonTitleForEmptyBlock)(void);@property(nonatomic,strong)NSString * (^actionButtonTitleForErrorBlock)(NSError *error);@property(nonatomic,strong)UIImage * (^imageForEmptyBlock)();@property(nonatomic,strong)UIImage * (^imageForErrorBlock)(NSError *error);
.m
@implementation ModelStatusInfoB- (NSString *)titleForEmpty { returnself.titleForEmptyBlock();}- (NSString *)subTitleForEmpty { returnself.subTitleForEmptyBlock();}- (NSString *)actionButtonTitleForEmpty { returnself.actionButtonTitleForEmptyBlock();}- (NSString *)titleForError:(NSError *)error { returnself.titleForErrorBlock(error);}- (NSString *)subTitleForError:(NSError *)error { returnself.subTitleForErrorBlock(error);}- (NSString *)actionButtonTitleForError:(NSError *)error { returnself.actionButtonTitleForErrorBlock(error);}- (UIImage *)imageForEmpty { returnself.imageForEmptyBlock();}- (UIImage *)imageForError:(NSError *)error { returnself.imageForErrorBlock(error);}
client
@implementation ModelStatusHandler (Factory)+(ModelStatusHandler *)searchListFailedStatusHandler{ TBModelStatusInfoB *info = [[TBModelStatusInfoBalloc] init]; info.titleForEmptyBlock=^{ return @"没有搜索结果"; }; info.subTitleForEmptyBlock=^{ return@"没有找到相关的宝贝,先去看看热门搜索吧"; }; info.actionButtonTitleForEmptyBlock=^{ return @""; }; info.imageForEmptyBlock=^{ return [UIImageimageNamed:@"searchicon"]; }; info.titleForErrorBlock=^(NSError *error){ return @"数据加载失败"; }; info.subTitleForErrorBlock=^(NSError *error){ return@"请检查您的是否联网,点击按钮重新加载"; }; info.actionButtonTitleForErrorBlock=^(NSError *error){ return @"重新加载"; }; info.imageForErrorBlock=^(NSError *error){ return [UIImageimageWithContentsOfFile:TBPath(@"wifi")]; }; ModelStatusHandler *handler = [[ModelStatusHandleralloc] initWithStatusInfo:info]; return handler;}
- 用block 代替类继承实现方法的多态性重构技巧分享
- 利用C++模板,代替虚函数实现类的静态多态性及动态继承
- 利用C++模板,代替虚函数实现类的静态多态性及动态继承
- 利用C++模板,代替虚函数实现类的静态多态性及动态继承
- 类的继承和多态性
- 类的继承和多态性
- 类的继承与多态性
- 神奇的用 block 代替 drawRect ,所以不用继承 UIView 就可以绘制了
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数实现类的静态多态性
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数实现类的静态多态性
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 利用C++模板,代替虚函数,实现类的静态多态性
- 技巧:用 C 语言实现程序的多态性
- 对于用户上传不规划Html而导致页面布局错乱的一简单解决方法
- outlook2010如何导入csv的通讯录?
- 王垠的过去和现状
- Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
- linux-2.6.26内核中ARM中断实现详解(3)
- 用block 代替类继承实现方法的多态性重构技巧分享
- java1.5新特性:静态导入import static
- BaseSDK和DeploymentTarget
- ASP.NET MVC 利用ActionFilterAttribute来判断用户是否登陆等等
- 让SecureCRT vi中显示多色彩
- 使用RouteValueDictionary简化对Asp.net MVC Helper的扩展
- ajax请求错误的查看
- 导入Excel数据时对数据校验提示方法
- Q3-校门外的树做题总结