OC面向对象三大特征最后一个了,多态。
一 基本概念
多态:在代码汇总的体现就是,多种形态,必须要有继承,没有继承就没有多态。
在使用多态时,会进行动态检测,以调用真实地对象方法。
多态在代码中得体现就是简而言之的:父类指针指向子类对象(最开始看到的时候都这么说,没理解)
Animal类的声明
Animal类的实现
Dog类继承自Animal类
Dog类的实现
测试程序:
注意当中的 Animal *a = [[Dog alloc]init];
这就是父类指针指向子类对象!!!
二 使用注意
代码分析:
Dog *d = [[Animal alloc]init]; 动物是一条狗?语义正确么?
NSString *str = [Dog new]; 狗是一个字符串?正确么?
OC语言是一门弱语法的语言,编译的时候并不会报错,所以这就要求我们在实际的开发中一定要按照既定的规范来写代码,不要写出狗是一个字符串这样的问题。
多态的好处:
需要一个新的函数专门用来喂狗
Void feed(Dog *d){
[d eat];
}
这时候如果也需要喂猫,那就需要重写一个函数。
而狗和猫实际上都继承自动物类,所以在这里就可以使用多态来简化代码了。
这里只需要把函数的参数写成是Animal* 类,那么Dog和Cat类型的对象就都可以传入进来。
调用的时候直接改变参数就可以了。
多态的局限性:父类类型的指针变量不能直接调用子类特有的方法。
不建议的做法~
Animal *a = [[Dog alloc]init];
[a run];//在Animal类中没有run方法,这里调用了狗对象的方法。
解决方法:可以将a强制转换为Dog*类型的变量,如下:
Dog *d = (Dog *)a;//使用强制转换,这里a和d指向的是同一个狗对象
三 多态使用总结
(1)没有继承就没有多态
(2)代码的体香:父类类型的指针指向子类对象
(3)好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用去定义多个函数来和相应地类型进行匹配了。
(4 局限性:父类类型的变量不能直接调用子类特有的方法,如果必须调用,则必须强制转换为子类特有的方法。
四 字符串补充内容
@“234”字符串也是一个对象,属于NSString这个类。下面是对字符串对象的一些代码说明:
字符串对象的length方法:计算的是字符串的字数,而不是想strlen函数那样,计算的是字符串。如"哈ha123"length得出的结果是6,返回unsigned long类型,而strlen函数得出 的是8,因为一个汉字占3个字节。
提示:字数也包括空格