多态在iOS中的实际应用

使用场景

父类的方法满足不了子类的需求, 子类重写父类的方法 ,
重写的方法在子类的.m文件中,方法名与父类一样,当使用子类对象调用此方法时,调用子类的 方法;既要描述子类的重写方法,又要调用父类的此方法时,在重写的方法里调用父类的这个方法,如[super xxx]

多态的产生条件

1、必须有继承

2、父类指向子类的指针,如 Person *an = [Student alloc]init];

3、子类必须重写父类的方法

实际例子

如图
请添加图片描述

需求

知识数据在知识栏目展示为特定的样式,在其他栏目展示为普通样式,同时知识栏的vc 需要支持展示其他类型的数据

分析

知识 栏目的vc 需要支持展示其他类型的数据,则我们可以复用其他栏目的vc,但是由于知识栏中知识单条数据和其他栏目中的知识
单条数据展示的样式不一样,则原来的vc 并不能完全满足我们的需求
这时候,多态的优势就体现出来了

思路

我们为知识栏目新建一个vc, 这个 vc 继承于原来的其他栏目的vc,
然后,我们再重写返回cell的方法,在返回展示单条数据的时候,返回特定的知识cell,在返回其他类型cell的时候,就调用父类方法。

示例代码

//这里暴漏父类的代理方法是因为我们新建的子类要调用父类的方法
@interface ChannelContentListController : TPTableViewController

//这里暴漏这两个方法是因为知识栏目对应的控制器里面需要重写这两个方法, 里面需要调用父类的这两个方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

@end
/**
 知识vc继承于原有的vc
 */
@interface PCMKnowledgeViewController : ChannelContentListController
//- (void)pageChangeBegin:(NSInteger)index;
@end
/*
重写返回cell方法
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id item = self.dataList[indexPath.row];
    if ([item isKindOfClass:[listContObjectVO class]]) {
    ///在返回知识单条数据的时候,返回特定的知识栏目特有的cell
        listContObjectVO* listBO = item;
        if (listBO.cardMode.integerValue == KnowledgeCardType) {
            return [self knowledgeCellWithTable:tableView cellForRowAtIndexPath:indexPath];
        }
    }
    /// 在其他数据的时候,调用父类的方法
    return [super tableView:tableView cellForRowAtIndexPath:indexPath];
}

效果图

请添加图片描述
请添加图片描述

猜你喜欢

转载自blog.csdn.net/LIUXIAOXIAOBO/article/details/121388965