学习Java我们知道类有三大特征,封装,继承,多态.而在Objective-C中也有继承的概念,今天就来看看Objective-C中的继承和多态.

  首先,我们来看看示例代码:

//Animal.h
#import <Foundation/Foundation.h> @interface Animal : NSObject
{
int food_consumption; //食量
int count; //数量
int parturition_days; //生产周期
} -(int)count; -(void)setCount:(int)c; -(int)foodConsumption; -(void)setFoodConsumption:(int)food_c; -(int)parturitionDays; -(void)setParturitionDays:(int)parturition_day; @end
//Animal.m
#import "Animal.h" @implementation Animal -(int)count{
return count;
} -(void)setCount:(int)c{
count = c;
} -(int)foodConsumption{
return food_consumption;
} -(void)setFoodConsumption:(int)food_c{
food_consumption = food_c;
} -(int)parturitionDays{
return parturition_days;
} -(void)setParturitionDays:(int)parturition_day{
parturition_days = parturition_day;
} @end
//Panda.h
#import "Animal.h" @interface Panda : Animal @end
//Panda.m
#import "Panda.h" @implementation Panda @end
//Tool.h
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Panda.h" @interface Tool : NSObject +(void) initWithAnimalDictionary:(Animal *)animal andDict:(NSDictionary *)dict; @end
//Tool.m
#import "Tool.h" @implementation Tool +(void) initWithAnimalDictionary:(Animal *)animal andDict:(NSDictionary *)dict{
NSDictionary *animalDict;
if(YES == [animal isKindOfClass:[Panda class]]){
animalDict = [dict objectForKey:@"Panda"]; }else{
NSLog(@"error class!");
}
[animal setCount:[[animalDict objectForKey:@"count"] intValue]];
[animal setFoodConsumption:[[animalDict objectForKey:@"food_consumption"] intValue]];
[animal setParturitionDays:[[animalDict objectForKey:@"parturition_days"] intValue]];
} @end

data.plist文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fodder</key>
<dict>
<key>count_num</key>
<string>1024</string>
</dict>
<key>Panda</key>
<dict>
<key>food_consumption</key>
<string>2</string>
<key>count</key>
<string>6</string>
<key>parturition_days</key>
<string>76</string>
</dict>
</dict>
</plist>
//main.m
#import <Foundation/Foundation.h>
#import "Tool.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
Panda *panda = [[Panda alloc] init]; //读取plist
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; [Tool initWithAnimalDictionary:panda andDict:data]; int fooder_num = 0;
int surplus = 0;
int day = 1; NSDictionary *fooderDict = [data objectForKey:@"fodder"];
fooder_num = [[fooderDict objectForKey:@"count_num"] intValue];
surplus = fooder_num; while(surplus > 0){
if(0 == (day % [panda parturitionDays])){
[panda setCount:([panda count] + 1)];
}
surplus = fooder_num - ([panda count] * [panda foodConsumption]);
fooder_num = surplus; if(surplus){
NSLog(@"第 %d 天,熊猫:%d 只,饲料余量:%d 。\n", day, [panda count], surplus);
}
day++;
}
}
return 0;
}

(一)继承  

  继承是类中的一个重要的特性,它的出现使得我们没必要别写重复的代码,可重用性很高。当然Objective-C中的继承和Java中是一样的,没多大区别.不仅仅Java,C++也有继承特性,但C++支持多继承,而Objective-C不支持多继承.

  接下来,我们了解几个概念:

  (1)超类(superclass),是你所继承的类,例如,Panda的超类是Animal,Animal的超类是NSObject.

  (2)父类(parentclass),是超类的另一种表达方式,例如,Animal是Panda的父类.

  (3)子类(subclass),是实施继承的类,例如,Panda是Animal的子类.

  (4)孩子类(childclass),是子类的另一种表达方式,例如,Panda是Animal的孩子类.

  然后,说说继承的工作机制:

  (1)方法调度

  当代码发送消息时,Objective-C的方法调度程序将在当前类中搜索相应的方法.如果调度程序无法在接收消息的对象类中找到相应的方法,它就在该对象的超类中进行查找.

  (2)实例变量

  接下来我们看看Objective-C如何访问实例变量.创建一个新类时,其对象首先从自身的超类中继承实例变量,然后(可选)添加它们自己的实例变量.

  最后,说说重写方法,制作自己全新的子类时,通常需要添加自己的方法.有时,为了在类中引入某个独特的特性,需要添加新方法.还有些时候,可能需要替换或增强由这个新类的某个超类所定义的现有方法.当遇到我们子类特有的方法时,则只需要在子类中重写该方法即可.

(二)多态

  在Objective-C中,多态就是指,父类指针可以指向子类.

+(void) initWithAnimalDictionary:(Animal *)animal andDict:(NSDictionary *)dict;

  上例代码中的从字典中获取数据的类方法就很好地使用了多态.该方法主要是从字典中读取数据,示例中只有Panda一个子类,若是以后拥有更多的类,那么该功能的方法需要为每一个子类写一个方法,而使用多态特性,则只需根据传入的参数进行分别处理即可,减少代码冗余问题.

  以上,是学习Objective-C时对继承和多态的理解.

Objective-C 继承和多态的更多相关文章

  1. Objective-C中的继承和多态

    面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多 ...

  2. java中抽象、分装、继承和多态的理解

    1.抽象.封装装.继承和多态是java面向对象编程的几大特点. 抽象:所谓抽象就是对某件事务,我们忽略我们不关心不需要的部分,提取我们想要的属性和行为,并且以代码的形式提现出来:例如我们需要对一个学生 ...

  3. [转] JS中简单的继承与多态

    这里讲了一个最最最简单的JS中基于原型链的继承和多态. 先看一下以下这段代码的实现(A是“父类”,B是“子类”): var A = function(){ this.value = 'a'; this ...

  4. 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目

    小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...

  5. OC的封装、继承与多态

    面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...

  6. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  7. Java学习笔记 07 接口、继承与多态

    一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...

  8. JavaScript 面向对象程序设计(下)——继承与多态 【转】

    JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...

  9. Java继承和多态实例

    我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...

  10. python基础——继承和多态

    python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...

随机推荐

  1. 转:SQL2008 UNPIVOT 列转行示例

    CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int); GO INSERT INTO pv ...

  2. Tomcat的类加载器

    看完了Java类装载器,我们再来看看应用服务器(Tomcat)对类加载器的使用,每个应用服务器都有一套自己的类加载器体系,从而与Java的类加载器区别开以达到自己与应用程序隔离的目的.Tomcat的类 ...

  3. 让你的程序通过XP防火墙

    procedure TForm1.Button1Click(Sender: TObject); var FwMgr,Profile,FwApp: variant; begin FwMgr := Cre ...

  4. python语言 buffer类型数据的使用 'ascii' codec can't decode byte 0xe5 问题的解决

    在python中我们使用buffer类型时可以将其转换为str类型. 如果obejct的类型为<type 'buffer'> ,可以使用str(object)将其转换为字符串类型. 在转换 ...

  5. codeblocks中右键源文件没有Rename选项?

    那是因为你右击的那个文件已经被CB的编辑器打开,关闭即可,你就能看到Rename选项了. 或者更简单,翻到Files那一栏,然后右击某个文件夹选择"Make root"即可,就跟w ...

  6. 微信错误提示code= -4/微信发送被拒绝

    微信错误提示code= -4/微信发送被拒绝 在做第三方登录时.出现微信授权返回的错误码为:code= -4,原因是由于: (微信开放平台的签名填错了微信平台注冊的签名应该是:使用微信签名工具安卓到手 ...

  7. plsql programming 09 数字

    number 类型, 十进制数据类型(平台无关的) pls_integer 和 binary_integer 这两种数据类型和你底层硬件表示整数的方法完全一致, 这两种类型的运算是利用硬件原生, 机器 ...

  8. char * const p和const char *p的区别

    1. 前者定义P为常量,即只能单向赋值一次,P++展开为p=p+1,重复赋值给常量,出错,后者P为地址变量,地址变量是指向该变量的存储地址值如:4B3F6A,不能赋给一个字符值(字符相当于ascii表 ...

  9. 数值孔径NA、分辨率极限与衍射极限

    一.数值孔径  数值孔径(NA):是一个无量纲的数,用以衡量该系统能够收集的光的角度范围.越大,收集到的光越多,分辨率越高. 描述了透镜收光锥角的大小,决定着透镜收光能力和空间分辨率. 数值孔径(NA ...

  10. iOS - 逆向 - Objective-C代码混淆 -confuse.sh文件写法

    class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄. 所以,我们迫切的希望混淆自己的代码. 混淆的常规思路 混淆分许多 ...