威尼斯www.9778.com-威尼斯正版官方网站

建议27:明晓类公共领域的方法都是虚方法

日期:2020-01-01编辑作者:服务器&运维

本文实例讲述了js实现下拉框选择要显示图片的方法。分享给大家供大家参考。具体实现方法如下:

众所周知,在C++,C# 等面向对象开发语言中,虚方法(函数)是实现“多态”的基础,其实现原理:运行系统将根据对象的类型,自动选择适当的具体实现运行,没有定位虚方法的方法将不具备此特性。而要声明虚方法,就不得不依赖关键字"virtual"。
在C++,C#等面向对象开发语言中,虚方法是支持继承的,且在使用的时候,还要注意以下几点:
一旦在基类里把某个方法声明为虚方法,在子类里就不可能再把它声明为一个非虚方法了。
如果拿不准要不要把某个方法声明为虚方法,那么最好把他声明为虚方法。
在基类里把所有的方法都声明为虚方法会让最终生成的可执行代码的速度变得稍微慢一些,但是好处是可以一劳永逸的确保程序的行为符合预期。

要如何实现tableView的多选呢下面我总结了一下,只需要实现四个方法就能实现cell的多选模式
首先tableView的必须实现的协议方法不包含在四个方法里面,其中一个是UIViewcontroller里的方法,并不是协议方法.但是执行此方法会有一个bug,当你提交两种style时(在第二个实现方法中)不能实现滑动删除.
其中第一个方法是UIViewcontroller的方法 设置可编辑模式

下拉框选择要显示的图片  油菜花开 往事如茶 野花绽放 红叶传情  

在实现一个多层次的继承关系时,顶级的基类应该只有虚方法。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [_tableView setEditing:editing animated:animated];
    if (editing) {
    // no done
    } else {
    // delete selected array   
    [array removeObjectsInArray:_selectedArray]; // selected component added array
   [_tableView deleteRowsAtIndexPaths:_selectedIndexArray  withRowAnimation:UITableViewRowAnimationLeft]; // selected indexPath added array
       [_selectedIndexArray removeAllObjects];  // empty array component
       [_selectedArray removeAllObjects];   // empty array component
    }
}

希望本文所述对大家的javascript程序设计有所帮助。

析构器都是虚方法,从编译的角度看,他们只是普通的方法。如果他们不是虚方法,编译器就会根据他们在编译时的类型而调用哪个在基类里定义的版本(构造器),那样的话,有可能导致内存泄露。

第二个实现方法UITableViewdelegate 返回style

在C++中,只要在普通方法之前加上virtual关键字,就可以表示虚方法。
但在oc中,很难找到virtual关键字或其等价的,其实oc中不但有虚方法,甚至所有的方法都是虚方法。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
   // selected deleteStyle and insertStyle at the same time 
    return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
}

在oc中,覆盖积累的方法只需要重写即可。无需加任何关键字。但是在覆盖其他基类的方法时,必须决定是否要替换基类的方法的行为,或者扩展或者补充该行为。如果想要替换基类的行为,提供自己的方法实现即可;如果想要扩展该基类的行为,调用基类实现,并提供自己的代码即可。

第三个实现方法UITableViewdelegate 方法功能是选中

通过发送消息(与调用方法的消息相同)到super来调用基类实现。通过将消息发送给super,就将该方法的基类代码插入到重新实现的调用点。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.editing) {
       [_selectedIndexArray addObject:indexPath];  // add indexPath to array 
       [_selectedArray addObject:_array[indexPath.row]];// add component to array
    }
}

如果打算补充基类的实现行为,应该调用super。
如果打算替换基类的实现行为,就不用调用super。

第四个实现方法是UITableViewdelegate 方法是取消

在oc中,实现这种"纯虚方法"的类似功能,可以采用正式协议来实现,正式协议的方法,所有实现这个协议的类都必须实现。这就是一种验证,也就是说,只要这个类可以实现这个协议,那么他肯定可以处理协议中规定的方法,一个类可以实现任意多个协议。

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.editing) {
        [_selectedArray removeObject:_array[indexPath.row]]; // delete selected component
        [_selectedIndexArray removeObject:indexPath]; // delete selected indexPath
    }
}

要点##

(1)在Objective_C中,所有的方法都是虚方法。
(2)实现纯虚方法,依靠正式协议来实现。
(3)协议并不是真正的类,它只能声明方法,不能添加数据。
(4)非正式协议并不是真正的协议,它对代码没有约束力。

另外怎样实现单个cell的多功能呢,下面的方法能够解决此问题

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {    
    UITableViewRowAction *rowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
        [_nameArr removeObjectAtIndex:indexPath.row];
        [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    }];
    return @[rowAction];  // can add more rowAction to complete other operation
}

本文由威尼斯www.9778.com发布于服务器&运维,转载请注明出处:建议27:明晓类公共领域的方法都是虚方法

关键词:

JS+CSS实现Li列表隔行换色效果的方法_javascript技巧_脚本之家

本文实例讲述了JavaScript实现文字与图片拖拽效果的方法。分享给大家供大家参考。具体实现方法如下: 本文实例讲述...

详细>>

JS+CSS实现可拖动的弹出提示框

本文实例讲述了JS+CSS实现可拖动的弹出提示框。分享给大家供大家参考。具体实现方法如下: JS+CSS实现可拖动的弹出...

详细>>

JS+CSS实现Li列表隔行换色效果的方法

本文实例讲述了JS+CSS实现Li列表隔行换色效果的方法。分享给大家供大家参考。具体实现方法如下: JS+CSS实现Li列表隔...

详细>>

jQuery is函数用法3例_jquery_脚本之家

jQuery提供了is(卡塔尔方法能够很有益于的论断成分是或不是可知,是或不是隐伏,是或不是选中。 生龙活虎、推断元...

详细>>