概念
简单来讲:父类指针指向子类对象。
它是面向对象程序设计的一个重要特征,动态类型能使程序直到运行时才确定对象的真实类型,动态类型绑定能使程序直到运行时才确定要对那个对象调用的方法。
Objective-c 是动态语言,所以它具有动态类型和动态绑定的特性。Objective-c系统总是跟踪对象所属的类。对于类型的判断和方法的确定都是在运行时进行。
在代码里面的具体体现
Pet.h文件
@interface Pet : NSObject
@property (nonatomic,strong) NSString *name;
- (void)eatFood;
- (void)drink;
Pet.m文件
import "Pet.h"
@implementation Pet
@synthesize name;
- (id)init{
if (self = [super init])
{
self.name=@"Pet Demo";
}
return self;
}
- (void)eatFood
{
NSLog(@"PetEatFood");
}
- (void)drink
{
NSLog(@"petDrink");
}
Dog.h文件
@interface Dog : Pet
@end
Dog.m文件
- (void)eatFood
{
NSLog(@"%@:dogeatFood",self.name);
}
Cat.h文件
@interface Cat : Pet
@end
Cat.m文件
- (void)eatFood
{
[super eatFood];//通过super关键字可以调用基类的eatFood函数
NSLog(@"%@:cateatFood",self.name);
}
我们定义了一个Pet基类,里面有一个数据成员name,和两个函数成员eatFood和drink, Dog和Cat是从Pet派生的两个类,他们重写了基类eatFood的drink方法。
代码使用:
Pet*pet = [[Dog alloc]init];
[pet eatFood];
NSLog(@"PetAddressOrDogAddress=%@",pet);
pet = [[Cat alloc]init];
[pet eatFood];
NSLog(@"PetAddressOrCatAddress=%@",pet);
[pet drink];
NSLog(@"PetAddressOrCatAddress=%@",pet);
输出如下:
2020-06-23 20:30:55.838586+0800 gcdLock[1842:81235] PetDemo:dogeatFood
2020-06-23 20:30:55.838791+0800 gcdLock[1842:81235] PetAddressOrDogAddress=<Dog: 0x600000228700>
2020-06-23 20:30:57.963798+0800 gcdLock[1842:81235] PetEatFood
2020-06-23 20:30:57.963981+0800 gcdLock[1842:81235] Pet Demo:cateatFood
2020-06-23 20:30:57.964126+0800 gcdLock[1842:81235] PetAddressOrCatAddress=<Cat: 0x600000234650>
2020-06-23 20:30:57.964267+0800 gcdLock[1842:81235] i am Pet Demo.
网友评论