黑马程序员-OC语言-多态、代理

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

  • 开场白:多态是C语言的概念,代理是OC的概念,多态作为面向对象三大特性之一,重要性可见一斑,代理也更不可小视。

  • 为什么要把它们放到一起来说?因为我对它们在概念性和功能性上有点混淆。今天就把要它们说清楚了,解决这场纠纷!


多态:不同的对象以不同的方式响应相同名称方法的能力称为多态 (也就是一个方法有多种状态,多种状态体现在子类对父类方法重写中)


话说:有一个消防员(Fireman)类、一个医生(Doctor)类,都继承自人类(Person)

消防员类:save方法(灭火)
医生类:save方法(输液)
人类:在这代表上帝

@interface Person:NSObject
@end
@implementation Person
@end
@interface Fireman:Perosn
@end
@implementation Fireman
-(void) save;
@end
@interface Doctor:Person
@end
@implementation Doctor
-(void) save;
@end
Person *p1=[Doctor new];//Doctor是Person的子类
person *p2=[Fireman new];//Fireman是Person的子类
[(Doctor *)p1 save];
[(Fireman *)p2 save];
  • 编译时,编译器会检查指针p1、p2的类型(Person)有没有这个方法,如果有,不报错;如果没有,报错。(强制类型转换会避过这一步)
  • 运行时,会检查p1\p2指针的真正类型(Doctor、Fireman)有没有这个方法,如果有,不报错;如果没有,报错。
  • 所有的强制类型转换都是临时的。

多态存在的意义:

  1. 简化了编程接口。类和类之间可以重用一些习惯性的命名。这样,编程接口就是一些抽象的行为的集合
  2. 代码扩展性和复用性更好。
  3. 方法多样性
  4. 高聚合性和低耦合性

代理:让别人代替你去做事,代替你完成任务的对象,就是你的代理。

协议:

@protocol LaunchProtocol 
-(void) shoot;
@end

人类:


@interface Person : NSObject
@property(nonatomic,strong) id delegate;
-(void) launch;
@end

@implementation Person
{
    NSLog(@"扣动扳机~~~");
    if (self.delegate!=nil) 
    {
        [self.delegate shoot];
    }
}
@end

枪类:(遵守LaunchProtocol协议)

@interface cf : NSObject<LaunchProtocol>
@end

@implementation Gun
-(void) shoot
{
    NSLog(@"biu  biu   11biu");
}
@end

main函数

Person *p=[Person new];
Gun *gun=[Gun new];
p.delegate=gun;
[p launch];//person类只有扣动扳机的方法,没有发射的方法,发射的方法就找到了枪去做。

代理存在的意义:

1.拓展了功能和方法
2.高聚合性和低耦合性


自己的一些思考:代理没有继承关系,通常A知道什么是什么时候做事,但不知道怎么做,而B知道怎么做却不知道什么时候做,让AB合作,在正确的时间做正确的事。
多态是多个子类相应一个方法,主要作用是:简化编程接口,提高代码扩展性。
都实现高聚合低耦合。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

你可能感兴趣的:(黑马程序员-OC语言-多态、代理)