一、继承:
先定义一个类:
@interface Animal : NSObject
{
NSString *name;
GCFloat height;
}
-(void)eat;
@end
定义一个子类:
@interface Dog :Animal
{
NSString *speed;
}
-(void)run;
@end
在上面定义的两个类中:Animal 称为父类 Dog子类,后者继承了前者。
分别定义一个实例变量:
Animal *animal
Dog *dog;
在Animal类对象animal中有实例变量name 和 height 和方法eat;
在Dog 子类的对象中有实例变量name、height和speed以及方法eat、run;
可以看到在子类继承父类的过程中,子类继承了父类的实例变量和方法。
这就是继承,一个类拥有另一个类的属性和方法的过程。
二、多态
一直有个疑问就是怎么理解书上说的---“在调用类方法或者实例方法的时候所有可以用父类的地方都可以用其子类替换”
带着这个疑问我们来剖析什么是多态。
a、概念说明
->一种类型,多种形态
->在OC中表现为父类指针可以指向父类对象,也可以指向子类对象
->直到运行期,根据父类指针实际指向的对象的类型,确定执行父类方法还是子类中重写的方法
b、多态产生的条件
->必须有继承关系;
->子类要重写父类的方法;
->父类指针指向子类对象
c、好处与限制
->好处:使用多态后,可以用父类指针操纵所有的子类对象,程序的可扩展性就会增强
->限制:父类指针不能调用子类新增的方法(只能重写的)
背景:有一个人有两只狗,它们品种不同,跑的速度不同。
声明一个对象为人的类
@interface Person :NSObject
{
}
-(void)testWhichDog:(Dog*)dog;
@end
声明关于狗对象的类
@interface Dog : NSObject
{
NSString *name;
GCFloat height;
}
-(void)run;
@end
@interface Dog 1:Dog
{
NSString *speed1;
}
-(void)run;
@end
子类2
@interface Dog2 :Dog
{
NSString *speed2;
}
-(void)run;
@end
为什么在 (void)testWhichDog:(Dog*)dog中参数要(Dog*)类型?
如果不写成Dog*)类型而是Dog1* Dog2 *这种类型,当狗的数量很多则需要写很多个函数,但是我们可以声明成父类类型,就只需要写一个方法就可以了。父类指针可以访问子类中重写的方法。