Objective-c-多态

来源:互联网 发布:dos运行java程序 编辑:程序博客网 时间:2024/05/18 05:04
在OC中也有继承和多态,比如说一个子类去继承一个父类,我们假设子类是Square,父类是Shape,我们的子类能继承父类的变量属性和行为,就是父类的指针可以直接指向他的子类比如说以下的写法是可以的。
 Square *square=[[Square alloc]init];    Shape * shape=square;NSLog("@"%d",[shape area]);

因为在Square子类中有area这个方法而且还是重写了父类的area的方法所以调用的是area的这个方法,就是用父类对象去承载一个子类对象,在运行的适合能够区分出来的。多态必须要相同的方法,如果说我们有个Circle类,如果我们让这个类继承了Shape这个类,我们重新写了个-(double)area方法,而之前的area的方法是-(int)area,如果让父类的指针去指向Circle类的对象去调用area的方法的话只会调用父类的方法.

OC中的id其实就是void * 可以代表任何一类的指针,定义一个对象可以这么定义。

id s=[[Square alloc]init];NSLog(@"%d",[s area]);//会报错
为什么第二个语句会报错呢?因为id本身是一个动态类型,在刚开始定义的时候确定不了,只有在运行的时候才能确定。存储在id里面的变量因为在编译时无法确定其的类型,要到运行时才能检查。而编译时就能确定的类型就是比如我们之间定义的一个Shape类型,是在定义时就能确定的。将一个变量定义为特定的类型的对象的时候用的就是静态形式。
NSObject支持的三种基本的方法

-(BOOL)isKindOf:class-object(判断对象是否是class-object或其子类的成员)

-(BOOL)isMemberOfClass:class-object(只能判断对象是不是class-object的成员)

-(BOOL)respondsToSelector:selector(判断对象是否能够响应selector所指定的方法)

id str=[[Square alloc]init];BOOL a=[str isKindOfClass:[Square class]];//此处a是YESid str=[[Square alloc]init];BOOL a=[str isKindOfClass:[Shape class]];//此处a也为YESid str=[[Square alloc]init];BOOL a=[str isMemberOfClass:[Shape class]];//此处a为NOid str=[[Square alloc]init];BOOL a=[str isMemberOfClass:[Square class]];//此处a为YES//SEL也是OC中的一种类型它是指向函数的一个指针,用它来标识一函数的地址SEL sel=@selector(area)//此处sel是保存所以名称为area函数的地址BOOL a=[str respondsToSelector:sel];//此处为YES[str performSelector:sel];//此处str可以运行area函数,这里是去调用这个消息,不应该去处理它的一个返回值


 
原创粉丝点击