iOS基础(oc)-多态
来源:互联网 发布:网络舆情周期 编辑:程序博客网 时间:2024/05/03 18:29
------知之博客 期待与您交流! -------
一 基本概念
多态在代码中的体现,即为某一类事物的多种形态,OC对象具有多态性。必须要有继承,没有继承就没有多态。在使用多态时,会进行动态检测,以调用真实的对象方法。多态在代码中的体现即父类指针指向子类对象。
Person *p = [Student new]; p->age = 100; [p walk];
二 多态使用注意
1.多态的好处
用父类接收参数,节省代码
需要一个新的函数专门用来喂狗
void feed(Dog *d)
{
[d eat];
}
如果这个时候也需要喂猫,那就应该重写新一个新的函数
void feed(Cat *c)
{
[c eat];
}
而狗和猫实际上都继承自动物这个类,在这里就可以使用多态来简化代码了。
这里只需要把函数的参数写成是Animal *类型的,那么Dog和Cat类型的对象就都可以传入进来。
调用的时候直接改变参数就可以了。
2.多态的局限性
不能访问子类的属性(可以考虑强制转换)
不建议的做法:
Animal *a=[[Dog alloc] init];
[a run]; // 在Animal类中没有run方法,这里调用了狗对象的方法。
解决方法:可以将a强制转换为Dog*类型的变量,如下:
Dog *d=(Dog *)a; // 使用强制转换,这里a和d指向的是同一个狗对象
3.多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
三、NSString的简单使用
#import <Foundation/Foundation.h> @interface Person : NSObject { //char *_name; NSString *_name; } @end int main() { /* // 最简单的创建字符串的方式 NSString *str = @"itcast"; char *name = "itcast"; NSLog(@"我在%@上课", str); //NSLog(@"%s", name); */ int age = 15; int no = 5; NSString *name = @"哈哈jack"; // length方法算的是字数 int size = [name length]; NSLog(@"%d", size); // 创建OC字符串的另一种方式 NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@", age, no, name]; NSLog(@"---- %ld", [newStr length]); return 0; }
注意:字符串对象的length方法:计算的是字符串的字数,而不是像strlen函数那样,计算的是字符数。如“哈ha123”length得出的结果是6,返回unsigned long类型,而strlen函数得出的结果是8,因为一个汉字占3个字节。提示:字数也包括空格。
四、多态使用实例
#mport <Foundation/Foundation.h> // 动物 @interface Animal : NSObject - (void)eat; @end @implementation Animal - (void)eat { NSLog(@"Animal-吃东西----"); } @end // 狗 @interface Dog : Animal - (void)run; @end @implementation Dog - (void)run { NSLog(@"Dog---跑起来"); } - (void)eat { NSLog(@"Dog-吃东西----"); } @end // 猫 @interface Cat : Animal @end @implementation Cat - (void)eat { NSLog(@"Cat-吃东西----"); } @end // 如果参数中使用的是父类类型,可以传入父类、子类对象 void feed(Animal *a) { [a eat]; } int main() { NSString *d = [Cat new]; [d eat]; /* Animal *aa = [Dog new]; // 多态的局限性:父类类型的变量 不能 用来调用子类的方法 //[aa run]; // 将aa转为Dog *类型的变量 Dog *dd = (Dog *)aa; [dd run]; */ //Dog *d = [Dog new]; //[d run]; /* Animal *aa = [Animal new]; feed(aa); Dog *dd = [Dog new]; feed(dd); Cat *cc = [Cat new]; feed(cc); */ /* // NSString *s = [Cat new]; Animal *c = [Cat new]; NSObject *n = [Dog new]; NSObject *n2 = [Animal new]; // 多种形态 //Dog *d = [Dog new]; // Dog类型 // 多态:父类指针指向子类对象 Animal *a = [Dog new]; // 调用方法时会检测对象的真实形象 [a eat]; */ return 0; }
- iOS基础(oc)-多态
- iOS基础(oc)-继承
- iOS基础(oc)-封装
- ios学习笔记--(oc基础1)
- ios学习笔记--(oc基础3)
- ios学习笔记--(oc基础4)
- IOS学习---OC基础学习(Foundation)
- ios(一) OC基础
- IOS(一)OC基础
- 黑马程序员——IOS基础(OC基础)
- iOS基础学习总结(OC基础总结)
- iOS基础之OC:OC对象方法
- IOS学习之oc基础
- IOS OC基础 +-的区别
- IOS OC基础 id是什么?
- ios学习笔记-(oc基础-面向对象小系统)
- iOS编程基础-OC(四)-内存管理(续)
- IOS学习---OC基础学习(ARC 协议)
- Android Studio之RenderingException错误
- 多媒体编程
- mac下eclipse的快捷键
- 内容提供者
- RobotFramework+Selenium2环境搭建与入门实例
- iOS基础(oc)-多态
- Android3.0特性
- 使用花生壳怎样搭建Openvpn
- 安卓开发——AndroidManifest.xml标签作用详解二
- 1013: [JSOI2008]球形空间产生器sphere
- 项目管理工具Maven(二)
- Codevs2038香甜的黄油题解
- java 堆排序
- Web中树形数据(层级关系数据)的实现—以行政区树为例(二)