多态

作者: 往事不许提 | 来源:发表于2019-05-05 17:31 被阅读0次

    iOS | 多态的实际运用

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

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

    有一个tableView,它有多种cell,cell的UI差异较大,但是它们的model类型又都是一样的。

    由于这几种cell都具有相同类型的model,那么你肯定会先建一个基类cell,如:

    @interface BaseCell : UITableViewCell@property (nonatomic, strong) Model *model;
    @end
    

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

    image

    红绿蓝三种子类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

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

    合理运用类的多态性可以降低代码的耦合度让代码更易扩展。
    原文:http://www.cocoachina.com/ios/20190107/26049.html

    相关文章

      网友评论

          本文标题:多态

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