相同点
- 协议和抽象基类都需要子类重写方法
- 都不可以直接实例化
不同点
- 抽象基类可以抽取高度相同的方法避免重写多写(一般成为默认行为),所以抽象基类重复使用的代码部分可以不重写;
- 抽象基类可以有私有方法(基于第2条,可以抽取高度相同的方法);协议作为对外接口,一般都是公开方法
- 协议没有实现,都是声明;抽象基类可以有实现,需要子类重写的方法请抛异常或者断言给使用者.
- 抽象基类和子类是继承关系,协议和类是声明关系
- 由于OC中类继承是单继承,而可以同时使用多个协议,所以各有各的优点.
- 如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象(面向对象三大特性之一),接口变量必须指向实现所有接口方法的类对象(如:** id<Eatting,running> **)
协议
协议俗称“接口”,定义协议一般是几个不同的类型实现同一个方法。
比如 人、鱼、青蛙都要游泳,每个类型的游泳本身都不相同,应该将“游泳”定义为一个协议,每个类均要实现游泳的功能。
虚拟类适合于有共通实现属性的类,但是又存在些许差异。
例如:cell和cellmodel本身都适合于定义虚拟基础类,但是 cellcontroller 需要定义为协议方法
网友评论