多态是面试程序设计(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>
这个在我本身的代码里面也会有,其实这里面也用了类的多态性。
一句话概括多态:子类重写父类的方法,父类指针指向子类。
多态的三个条件
- 继承:各种cell继承自BaseCell
- 重写:子类cell重写BaseCell的set方法
- 父类cel指针指向子类cell
以上就是多态在实际开发中的简单应用,合理使用多态可以降低代码的耦合度,可以让代码更易拓展。
网友评论