一句话概括多态:子类重写父类的方法,父类指针指向子类。
或许你对多态的概念比较模糊,但是很可能你已经在不经意间运用了多态。比如说:
有一个tableView,它有多种cell,cell的UI差异较大,但是它们的model类型又都是一样的。
由于这几种cell都具有相同类型的model,那么你肯定会先建一个基类cell,如:
@interface BaseCell : UITableViewCell
@property (nonatomic, strong) Model *model;
@end
然后各种cell继承自这个基类cell:
红绿蓝三种子类cell@interface RedCell : BaseCell
@end
子类cell重写BaseCell的setModel:
方法:
// 重写父类的setModel:方法
- (void)setModel:(Model *)model {
// 调用父类的setModel:方法
super.model = model;
// do something...
}
在controller中:
// cell复用ID array
- (NSArray *)cellReuseIdArray {
if (!_cellReuseIdArray) {
_cellReuseIdArray = @[RedCellReuseID, GreenCellReuseID, BlueCellReuseID];
}
return _cellReuseIdArray;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellResueID = nil;
cellResueID = self.cellReuseIdArray[indexPath.section];
// 父类
BaseCell *cell = [tableView dequeueReusableCellWithIdentifier:cellResueID];
// 创建不同的子类
if (!cell) {
switch (indexPath.section) {
case 0: // 红
{
// 父类指针指向子类
cell = [[RedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellResueID];
}
break;
case 1: // 绿
{
// 父类指针指向子类
cell = [[GreenCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellResueID];
}
break;
case 2: // 蓝
{
// 父类指针指向子类
cell = [[BlueCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellResueID];
}
break;
}
}
// 这里会调用各个子类的setModel:方法
cell.model = self.dataArray[indexPath.row];
return cell;
}
不出意外,类似于上面的代码我们都写过,其实这里就运用到了类的多态性。
多态的三个条件:
- 继承:各种cell继承自BaseCell
- 重写:子类cell重写BaseCell的
setModel:
方法 - 指向:父类cell指针指向子类cell
以上,就是多态在实际开发中的体现。
合理运用类的多态性可以降低代码的耦合度让代码更易扩展。
把这些概念性的东西跟日常实际开发相结合,你就能秒懂且难忘。
网友评论