iOS | 多态的实际运用

963 阅读1分钟
原文链接: www.jianshu.com

一句话概括多态:子类重写父类的方法,父类指针指向子类

或许你对多态的概念比较模糊,但是很可能你已经在不经意间运用了多态。比如说:

有一个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

以上,就是多态在实际开发中的体现。

合理运用类的多态性可以降低代码的耦合度让代码更易扩展。

把这些概念性的东西跟日常实际开发相结合,你就能秒懂且难忘。