4、iOS_多态

一、什么是多态

多态:不同对象以自己的方式响应相同的消息的能力叫做多态。

由于每个类都属于该类的名字空间,这使得多态称为可能。类定义中的名字和类定义外的名字并不会冲突。类的实例变量和类方法有如下特点:

和C语言中结构体中的数据成员一样,类的实例变量也位于该类独有的名字空间。

类方法也同样位于该类独有的名字空间。与C语言中的方法名不同,类的方法名并不是一个全局符号。一个类中的方法名不会和其他类中同样的方法名冲突。两个完全不同的类可以实现同一个方法。

方法名是对象接口的一部分。对象收到的消息的名字就是调用的方法的名字。因为不同的对象可以有同名的方法,所以对象必须能理解消息的含义。同样的消息发给不同的对象,导致的操作并不相同。

多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。

Objective-C支持方法名的多态,但不支持参数和操作符的多态。


二、多肽的应用举例

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

@interface BaseCell : UITableViewCell

@property (nonatomic, strong) Model *model;

@end

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


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

@interface BaseCell : UITableViewCell

@property (nonatomic, strong) Model *model;

@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 {

    staticNSString *cellResueID = nil;

    cellResueID = self.cellReuseIdArray[indexPath.section];

    // 父类BaseCell *cell = [tableView dequeueReusableCellWithIdentifier:cellResueID];

    // 创建不同的子类if(!cell) {

        switch (indexPath.section) {

            case0:// 红            {

                // 父类指针指向子类cell = [[RedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellResueID];

            }

                break;

            case1:// 绿            {

                // 父类指针指向子类cell = [[GreenCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellResueID];

            }

                break;

            case2:// 蓝            {

                // 父类指针指向子类cell = [[BlueCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellResueID];

            }

                break;

        }

    }

    // 这里会调用各个子类的setModel:方法cell.model = self.dataArray[indexPath.row];

    return cell;

}

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

多态的三个条件

继承:各种cell继承自BaseCell

重写:子类cell重写BaseCell的set方法

父类cel指针指向子类cell

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


链接:

https://www.cnblogs.com/guohai-stronger/p/10232467.html

https://www.jianshu.com/p/26fab97c51ba

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,618评论 1 32
  • UITableViewCell 父类是UIView UITableView的每一行都是一个UITableViewC...
    翻这个墙阅读 6,793评论 0 1
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,490评论 0 1
  • 我们在上一篇《通过代码自定义不等高cell》中学习了tableView的相关知识,本文将在上文的基础上,利用sto...
    啊世ka阅读 1,636评论 2 7
  • 最近在梦想力实验室带大家拆关于天赋的书。 关于天赋,人人都有,也都可以找到。有的人瞬间顿悟醍醐灌顶就找到自己天赋热...
    梦想森林DreamForest阅读 478评论 2 3

友情链接更多精彩内容