多态
一.多态与类的消息(方法)机制
指同一个消息(方法)根据发送的对象不同,而采用不同的行为方式
//因为其他类都是继承父类的 我们要添加方法也只是再父类那里添加方法,所以不会对其他类产生影响,因为父类的方法(消息)子类爱用不用,没什么影响
- 扩充性 我们添加方法不会影响其他类
//我们要调用同一个功能,而这个功能有很多对象来进行的,我们可以把他们的父类弄成某个类的成员变量,再在实现的时候,我们只需传入某个子类的指针对象,就可以调用子类相对应得方法,从而产生不同的反应.
- 接口性 把功能封装
// 这样可以省略好多接口 比如:有很多动物继承animal 你难道也要像上面一样写这么多吗?用下面的方法 就只要写一条语句 这就是继承多态的好处
申明的地方
- (void) feedAnimal:(Animal *)animal
实现的地方
//这里就是 传入一个对象 你想谁来吃 就让谁来调用 然后实现他的方法 - (void) feedAnimal:(Animal *)animal{
[animal eat];
}
//比如某个子类的反应(也就是方法里面的内容)要修改 只需改子类里面的东西就可以
- 简化性 每个类都有一个功能,一个有功能有问题,只需要找到这个类去修改
【多态要求满足三个条件】继承(init),重写,父类引用指向子类对象
//其实多态就是指,同一个接口不同的实现。
【注】OC的成员方法采用消息机制,因此都是虚函数。
// 见多态Demo
【虚方法】
1.父类的指针,可以指向子类的对象。
2.响应消息,不看指针,看对象。
【注】虚方法体现了不同事物被同一事件触发,有不同的响应。
殴打小动物
有两种小动物,Lavra BlackBug,一个人去打他们,他们做出不同的反应
4.谢霆锋的家长问孩子是谁的?
张柏芝:谢霆锋的
谢霆锋:陈冠希的
陈冠希:反正张柏芝的
- (void)answer;
#import
#import "Animal.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 不要看指针类型,因为响应消息的是对象,看消息发送给哪个对象
// 这种不看指针,看对象的方法调用 叫做虚函数
// 父类类型的指针可以指向子类对象
Animal *ani = [[Dog alloc] init];
[ani jump];//Dog can jump 10m
}
return 0;
}
#import
@interface Animal : NSObject
- (void)jump;
@end
#import "Animal.h"
@implementation Animal
- (void)jump
{
NSLog(@"Animal can jump 3m");
}
@end
#import "Animal.h"
@interface Dog : Animal
@end
#import "Dog.h"
@implementation Dog
- (void)jump
{
NSLog(@"Dog can jump 10m");
}
@end
家长问
#import
#import "Parent.h"
#import "ZhangBoZhi.h"
#import "XieTingFeng.h"
#import "ChenGuanXi.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1. 获取家长
Parent *xieXian = [[Parent alloc] init];
// 2. 获取张柏芝
ZhangBoZhi *zbz = [[ZhangBoZhi alloc] init];
// 3. 获取谢霆锋
XieTingFeng *xtf = [[XieTingFeng alloc] init];
// 4. 获取陈冠希
ChenGuanXi *cgx = [[ChenGuanXi alloc] init];
// 5.家长问
[xieXian askParty:zbz];
[xieXian askParty:xtf];
[xieXian askParty:cgx];
}
return 0;
}
#import
#import "Party.h"
@interface Parent : NSObject
- (void)askParty:(Party *)party;
@end
#import "Parent.h"
@implementation Parent
- (void)askParty:(Party *)party
{
[party answer];
}
@end
#import
@interface Party : NSObject
- (void)answer;
@end
#import "Party.h"
@implementation Party
- (void)answer
{
}
@end
#import "Party.h"
@interface ZhangBoZhi : Party
@end
import "ZhangBoZhi.h"
@implementation ZhangBoZhi
- (void)answer
{
NSLog(@"谢霆锋的");
}
@end
import "Party.h"
@interface XieTingFeng : Party
@end
import "XieTingFeng.h"
@implementation XieTingFeng
- (void)answer
{
NSLog(@"陈冠希的");
}
@end
import "Party.h"
@interface ChenGuanXi : Party
@end
import "ChenGuanXi.h"
@implementation ChenGuanXi
- (void)answer
{
NSLog(@"反正张柏芝的");
}
@end
#isMemberOfClass和isKindOfClass的区别
import
import "Animal.h"
import "Dog.h"
import "HaShiQi.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *animal = [[Animal alloc] init];
Dog *dog = [[Dog alloc] init];
HaShiQi *haShiQi = [[HaShiQi alloc] init];
//isMemberOfClass
// 判断是否这个类的实例
if ([dog isMemberOfClass:[Animal class]]) {
NSLog(@"dog 是Animal的实例");
}
if ([dog isMemberOfClass:[Dog class]]) {
NSLog(@"dog 是Dog的实例");
}
if ([dog isMemberOfClass:[HaShiQi class]]) {
NSLog(@"dog 是HaShiQi的实例");
}
// 判断对象是否是Animal这个类或者Animal这个类子类的实例
if ([haShiQi isKindOfClass:[Animal class]]) {
NSLog(@"haShiQi 是Animal的实例");
}
if ([haShiQi isKindOfClass:[Dog class]]) {
NSLog(@"haShiQi 是Dog的实例");
}
if ([haShiQi isKindOfClass:[HaShiQi class]]) {
NSLog(@"haShiQi 是HaShiQi的实例");
}
}
return 0;
}
import
@interface Animal : NSObject
@end
import "Animal.h"
@implementation Animal
@end
import "Animal.h"
@interface Dog : Animal
@end
import "Dog.h"
@implementation Dog
@end
import "Dog.h"
@interface HaShiQi : Dog
@end
import "HaShiQi.h"
@implementation HaShiQi
@end
#殴打动物多态案列
import
import "Lavra.h"
import "BlackBug.h"
import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1. 获取人这个对象
Person *person = [[Person alloc] init];
// 2. Lavra对象
Lavra *lavra = [[Lavra alloc] init];
// 3. BlackBug 对象
BlackBug *blackBug = [[BlackBug alloc] init];
// 4. 人去打虫子
// [person hitAnimalWithLavra:lavra];
// [person hitAnimalWithBlackBug:blackBug];
[person hitAnimal:blackBug];
}
return 0;
}
import
import "Lavra.h"
import "BlackBug.h"
import "Animal.h"
@interface Person : NSObject
- (void)hitAnimal:(Animal *)ani;
//- (void)hitAnimalWithLavra:(Lavra *)lavra;
//- (void)hitAnimalWithBlackBug:(BlackBug *)blackBug;
@end
import "Person.h"
@implementation Person
- (void)hitAnimal:(Animal *)ani
{
[ani react];
}
//- (void)hitAnimalWithBlackBug:(BlackBug *)blackBug
//{
// [blackBug react];
//}
//
//- (void)hitAnimalWithLavra:(Lavra *)lavra
//{
// [lavra react];
//}
@end
import
@interface Animal : NSObject
- (void)react;
@end
import "Animal.h"
@implementation Animal
- (void)react
{
}
@end
import "Animal.h"
@interface Lavra : Animal
@end
import "Lavra.h"
@implementation Lavra
- (void)react{
NSLog(@"吓死宝宝了");
}
@end
import "Animal.h"
@interface BlackBug : Animal
@end
import "BlackBug.h"
@implementation BlackBug
- (void)react
{
NSLog(@"把人揍了一顿");
}
@end