继承
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.
什么时候用?
当两个类需要关联的时候用,
表示A类包含B类一个子类继承了父类,那么子类拥有子类所有的属性和方法,一个父类的子类可以有很多个,但是一个父类只能有一个.
好处:
子类可以直接访问父类中的属性和行为,
继承的出现提高了代码的复用性.
继承的出现让类与类之间产生了关系,提供了多态的前提.
子类的扩展:
定义类:1,看有没有父类;
2,再看父类里是否有子类需要的方法或者属性
3,如果是独有的方法或者属性,则在子类里单独定义(在父类的基础上扩展)
继承的特点:
1,子类不能定义父类相同的属性
2,子类与父类中可以定义相同的方法,-----叫重写
3,当子类与父类有同名方法时,用子类的
4,父类必须在子类定义之前声明.
5,一个类只能单继承(一级继承),但是能多层继承(多级继承或者间接继承).且多层继承没有限制
6,越是下层的子类功能越强
任何的类都必须有new方法才能创建对象,new方法是在NSObject中,是一个类方法,所以一个类要想创建对象,必须直接或者间接继承NSObject.
NSObject是OC是根类,是没有父类的.
多态:
事情的多种形态.
什么是多态?
生活中的体现
人:警察,小偷.
动物:狗,猫.
代码体现:父类的指针指向子类的对象
Dog *d=[Dog new]; //普通写法
Animal *a=[Dog new];//多态的写法
//Animal是父类,Dog是子类,父类的指针表示子类的对象.
注意:
多态对象必须是真实对象,不能不同类型转换,
多态
事情的多种形态.
什么是多态?
生活中的体现
人:警察,小偷.
动物:狗,猫.
代码体现:父类的指针指向子类的对象
Dog *d=[Dog new]; //普通写法
Animal *a=[Dog new];//多态的写法
//Animal是父类,Dog是子类,父类的指针表示子类的对象.
注意:
多态对象必须是真实对象,不能不同类型转换,
前提是:
1必须是继承关系的类才可以,而且是父类的指针代表子类的对象
父类的指针指向子类的对象,调用方法时,会自动找子类相对应的方法.
多态的表现:
父类的指针指向子类的对象
如:Animal是父类,它有两个子类的,Dog与Cat;
则Dog与Cat对象都可以这样表示:
Animal *a=[Dog new];
Animal *a=[Cat new];
*没有继承就没有多态--前提
作用及优点:增强扩展性
1,一个类可以表示多个对象,如上面的a可以表示Dog或Cat对象
2,如果方法参数中使用的是父类类型可以传入父类,子类对象.
局限性:
父类类型的变量不能直接调用子类特有(重写的不算)的方法.
必须强转为子类类型后,才能直接调用子类特有的方法.
多态的作用?
具有很强的扩展性,父类的 一个指针可以指向不同的子类对象.
//多态的写法.父类的指针指向子类的对象,会自动找子类的对应的方法
int main(){
Animal *am=[Dog new];
}
[am eat];
am=[Cat new];
[am eat];
return 0;
}
局限性:
父类的指针指向子类时,如果要调用子类的独有方法,必须要强转.
强转方法:
Animal *am=[Dog new];
//会有警告,因为父类中没有这个方法,不能这么用,这是多态的局限性
//[am kanMen];
Dog *tempDog=(Dog *)am;
[tempDog kanMen];
[am eat];
am=[Cat new];
[am eat]; |