一、什么是多态
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
由于每个类都属于该类的名字空间,这使得多态称为可能。类定义中的名字和类定义外的名字并不会冲突。类的实例变量和类方法有如下特点:
和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