美文网首页
iOS多态使用小结

iOS多态使用小结

作者: 奔跑的小蚂蚁_8b28 | 来源:发表于2021-08-11 10:04 被阅读0次

多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态。比如说:

有一个tableView,它有多种cell,cell的UI差距较大,但是他们的model类型又都是一样的。由于这几种的cell都具有相同类型的model,那么肯定先创建一个基类cell,如:

<pre style="margin: 0px; padding: 0px; overflow: auto; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">@interface BaseCell : UITableViewCell

@property (nonatomic, strong) Model *model;

@end</pre>

然后各种cell继承自这个基类cell

红绿蓝三种子类cell如下类似

<pre style="margin: 0px; padding: 0px; overflow: auto; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">@interface BaseCell : UITableViewCell

@property (nonatomic, strong) Model *model;

@end</pre>

子类cell重写BaseCell的setModel方法

复制代码 复制代码

<pre style="margin: 0px; padding: 0px; overflow: auto; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">// 重写父类的setModel:方法

  • (void)setModel:(Model *)model {
    // 调用父类的setModel:方法
    super.model = model;

    // do something...
    }</pre>

复制代码 复制代码

在Controller中

复制代码 复制代码

<pre style="margin: 0px; padding: 0px; overflow: auto; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">// 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;
    }</pre>

复制代码 复制代码

这个在我本身的代码里面也会有,其实这里面也用了类的多态性。

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

多态的三个条件

  1. 继承:各种cell继承自BaseCell
  2. 重写:子类cell重写BaseCell的set方法
  3. 父类cel指针指向子类cell

以上就是多态在实际开发中的简单应用,合理使用多态可以降低代码的耦合度,可以让代码更易拓展。

相关文章

网友评论

      本文标题:iOS多态使用小结

      本文链接:https://www.haomeiwen.com/subject/gbwqbltx.html