iOS开发根底-多态

多态

1.多态的概念

多态简略来说便是多重状态,是不同的目标以自己的办法去呼应音讯的能力,便是一个目标是A类,可是他也可所以B类,这个是根据OC的动态言语的特性在编译时决议的,是OC的一个根本且重要的特性。而多态在OC中的主要是用承继来表现的。
在OC的完成中,一般运用承继的办法来完成类的扩展,一般来说便是经过子类去掩盖和重载父类的办法,来到达对同一类目标的同一办法的调用产生不同的结果。(即 父类的指针指向了子类目标)

2.简略的例子

@interface familyPeople : NSObject
- (void) familyPeopleName:(MultiPersion *)animal;
@end
#import "familyPeople.h"
@implementation familyPeople
- (void)familyPeopleName:(MultiPersion *)animal {
    [animal namePersion];
}
@end
@interface** MultiPersion : NSObject
- (void)namePersion;
@end
#import "MultiPersion.h"
@implementation** MultiPersion
-(void)namePersion {}
@end
#import "MultiPersion.h"
@interface** MultiPersionMan : MultiPersion
@end
#import "MultiPersionMan.h"
@implementation** MultiPersionMan
- (void)namePersion {
    NSLog(@"男人");
}
@end
#import "MultiPersion.h"
@interface** MultiPersionWomen : MultiPersion
@end
#import "MultiPersionWomen.h"
@implementation** MultiPersionWomen
- (void)namePersion {
    NSLog(@"女人");
}
@end

在上面的代码中,MultiPersionWomen和MultiPersionMan便是承继于MultiPersion。
当在familyPeople传入的是他们的父类MultiPersion,可是在实践调用中能够传入他们的子类并调用子类的办法即 父类的指针指向了子类目标

familyPeople *family = [[familyPeople alloc]init];
MultiPersionWomen *women = [[MultiPersionWomen alloc]init];
MultiPersionMan *man = [[MultiPersionMan alloc]init];
[family familyPeopleName:women];
[family familyPeopleName:man];

由上面的简略例子能够看出 完成多态,需要两个类之间有承继关系,子类重写了父类的办法或许声明晰一个新的办法供调用,且父类的指针指向了承继的子类,留意 OC支持办法名的多态,但不支持参数和操作符的多态。

3.多态的原理和条件

多态的完成原理来自于 动态绑定,由于动态类型能使程序直到执行时才确认目标的真实类型且动态类型绑定能使程序直到执行时才确认要对那个目标调用的办法。
而为了完成这一功用是经过一个叫做selector的选取器完成的。selector有两个意思, 当用在给目标的源码音讯时,用来指办法的名字。它也指那个在源码编译后代替办法名的仅有的标识符。编译后的选择器的类型是SEL有相同名字的办法、也有相同的选择器。你能够运用选择器来调用一个目标的办法。

selector的特点是:

选取器确认的是办法名,而不是办法完成。这是多态性和动态绑定的根底,它使得向不同类目标发送相同的音讯成为现实;不然,发送 音讯和规范C中调用办法就没有差异,也就不或许支持多态性和动态绑定。
别的,同一个类的同名类办法和实例办法具有相同的选取器。
音讯机制经过选取器找到办法的回来值类型和参数类型,因而,动态绑定(例:向id界说的目标发送音讯)需要同名办法的完成具有相 同回来值类型和相同的参数类型;不然,运行时或许呈现找不到对应办法的过错。

  • 一切同名的办法具有相同的选取器
  • 一切的选取器都是不一样的
选择器的类型是 SEL。@selector指示符用来引用选择器,回来类型是SEL。
SEL responseSEL;      
responseSEL = @selector(loadDataForTableView:);  
responseSEL = NSSelectorFromString(@"loadDataForTableView:");

能够经过上面大办法来获取选取器selector