Objective-C中的面向对象编程
2016-04-06 00:09
239 查看
1.过程式编程实例,画出Shape数组中的图形:
基于OOP编程,可以将上述代码改写为以下格式:
请注意object-c中的接口,类的定义以及类方法的调用,这里与C++还是存在很多的不同。
可能会遇到错误:Must explicitly describe intended ownership of an object array parameter,解决方法如下:
![](http://images2015.cnblogs.com/blog/689069/201604/689069-20160406000917203-430938399.png)
将Objective-c Automatic Reference Counting 设置为No,关闭ARC即可。
// // main.m // hello-obj // // Created by zhouyang on 16/4/4. // Copyright © 2016年 zhouyang. All rights reserved. // #import <Foundation/Foundation.h> //枚举变量,代表形状 typedef enum{ kCircle, kRectangle, kEgg } ShapeType; //枚举变量,代表颜色 typedef enum{ kRedColor, kGreenColor, kBlueColor } ShapeColor; //结构体,代表形状 typedef struct{ int x,y,width,height; }ShapeRect; //结构体,表示多边形的各项属性 typedef struct { ShapeType type; ShapeColor fillColor; ShapeRect bounds; }Shape; //返回颜色对应的NSString NSString *colorName(ShapeColor colorName){ switch(colorName){ case kRedColor: return @"red"; break; case kGreenColor: return @"green"; break; case kBlueColor: return @"blue"; break; } return @"no clue"; } //“画出”圆,其实就是输出图形的各项属性 void drawCircle(ShapeRect bounds,ShapeColor fillColor){ NSLog(@"drawing a circle at (%d,%d,%d,%d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor) ); } //“画出”长方形 void drawRectangle(ShapeRect bounds,ShapeColor fillColor){ NSLog(@"drawing a rectangle at (%d,%d,%d,%d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor) ); } //"画出"Egg void drawEgg(ShapeRect bounds,ShapeColor fillColor){ NSLog(@"drawing a egg at (%d,%d,%d,%d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor) ); } //遍历Shape数组,画出对应的图形 void drawShapes(Shape shapes[],int count){ for(int i=0;i<count;i++){ switch (shapes[i].type) { case kCircle: drawCircle(shapes[i].bounds, shapes[i].fillColor); break; case kRectangle: drawRectangle(shapes[i].bounds,shapes[i].fillColor); break; case kEgg: drawEgg(shapes[i].bounds,shapes[i].fillColor); break; default: NSLog(@"can't find the shape!"); } } } int main(int argc, const char * argv[]) { Shape shapes[3]; //Circle ShapeRect rect0={0,0,10,30}; shapes[0].type=kCircle; shapes[0].fillColor=kRedColor; shapes[0].bounds=rect0; //Rectangle ShapeRect rect1={30,40,50,60}; shapes[1].type=kRectangle; shapes[1].fillColor=kGreenColor; shapes[1].bounds=rect1; //Egg ShapeRect rect2={15,18,37,29}; shapes[2].type=kEgg; shapes[2].fillColor=kBlueColor; shapes[2].bounds=rect2; //画出数组Shape中的图形 drawShapes(shapes,3); }
基于OOP编程,可以将上述代码改写为以下格式:
#import <Foundation/Foundation.h> //注意枚举变量的定义,变量之间以逗号隔开 typedef enum{ kRedColor, kGreenColor, kBlueColor }ShapeColor; typedef struct { int x,y,width,height; }ShapeRect; NSString *ColorName(ShapeColor color){ switch (color) { case kRedColor: return @"red"; break; case kGreenColor: return @"green"; break; case kBlueColor: return @"blue"; break; } return @"no clue"; } //定义接口 //@告诉编译器,这里是对C的扩展 @interface Circle:NSObject{ //定义数据成员 @private ShapeColor fillColor; ShapeRect bounds; } //列举方法的名称,返回值的类型和某些参数 //前面的短线表明这是Objective-c方法的声明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Circle //接口定义完毕 //下面开始实现接口Circle @implementation Circle - (void) setFillColor:(ShapeColor) c { fillColor=c; }//设置颜色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Circle //定义接口 //@告诉编译器,这里是对C的扩展 @interface Rectangle:NSObject{ //定义数据成员 @private ShapeColor fillColor; ShapeRect bounds; } //列举方法的名称,返回值的类型和某些参数 //前面的短线表明这是Objective-c方法的声明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Rectangle //接口定义完毕 //下面开始实现接口Rectangle @implementation Rectangle - (void) setFillColor:(ShapeColor) c { fillColor=c; }//设置颜色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a rectangle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Egg //定义接口 //@告诉编译器,这里是对C的扩展 @interface Egg:NSObject{ //定义数据成员 @private ShapeColor fillColor; ShapeRect bounds; } //列举方法的名称,返回值的类型和某些参数 //前面的短线表明这是Objective-c方法的声明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Triangle //接口定义完毕 //下面开始实现接口Triangle @implementation Egg - (void) setFillColor:(ShapeColor) c { fillColor=c; }//设置颜色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a egg at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Egg //定义接口 //@告诉编译器,这里是对C的扩展 @interface Triangle:NSObject{ //定义数据成员 @private ShapeColor fillColor; ShapeRect bounds; } //列举方法的名称,返回值的类型和某些参数 //前面的短线表明这是Objective-c方法的声明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Triangle //接口定义完毕 //下面开始实现接口Triangle @implementation Triangle - (void) setFillColor:(ShapeColor) c { fillColor=c; }//设置颜色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a triangle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Triangle //画出图形 //id 对应类实例 void drawShapes(id shapes[],int count){ for(int i=0;i<count;i++){ id shape=shapes[i]; [shape draw]; } } int main(int argc, const char * argv[]) { id shapes[4]; //Circle shapes[0]=[Circle new];//这里创建新的类实例将new加在类名称的后面 ShapeRect rect0={0,0,10,30}; [shapes[0] setBounds:rect0]; [shapes[0] setFillColor:kRedColor]; //Rectangle ShapeRect rect1={30,40,50,60}; shapes[1] =[ Rectangle new]; [shapes[1] setBounds:rect1]; [shapes[1] setFillColor:kGreenColor]; //Egg ShapeRect rect2={15,18,37,29}; shapes[2] =[Egg new]; [shapes[2] setBounds:rect2]; [shapes[2] setFillColor:kBlueColor]; //Triangle ShapeRect rect3 ={47,32,80,50}; shapes[3] =[Triangle new]; [shapes[3] setBounds:rect3]; [shapes[3] setFillColor:kGreenColor]; //画出数组Shape中的图形 drawShapes(shapes,4); return 0; }
可见利用OOP编程方式,增加新的图形更加简单,修改的地方更少。
请注意object-c中的接口,类的定义以及类方法的调用,这里与C++还是存在很多的不同。
可能会遇到错误:Must explicitly describe intended ownership of an object array parameter,解决方法如下:
![](http://images2015.cnblogs.com/blog/689069/201604/689069-20160406000917203-430938399.png)
将Objective-c Automatic Reference Counting 设置为No,关闭ARC即可。
相关文章推荐
- 深入理解Objective-C的Runtime机制
- objective-c之block 总结
- window.ActiveXObject使用说明
- 读匿名object对象的属性值
- Selective Search for Object Recoginition
- 分析驱动程序在IRQL>=DISPATCH_LEVEL时和DPC过程中不能用KeWaitForSingleObject等待对象的原因
- HBase Error: connection object not serializable
- page object模式参考资料
- 手机使用jqueryMobile,提示jquery mobile: Object [object Object] has no method 'jqmData'
- 向下之旅(二十四):kobject与sysfs
- Swift补基础之Selector、条件编译、编译标记、NSObject
- java中的Object...是什么意思详解。
- js post json、object、application/json数据,Nodejs获取json数据
- 谈谈 Object.create ,JS的原型继承
- 【iOS开发技术】对象关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- Hibernate报错:org.hibernate.ObjectNotFoundException: No row with the given identifier exists 解决办法
- Objective-c 内存管理-MRC 引用计数器
- Objective-c 内存管理-MRC retain&release
- Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数
- android 子线程通过bundle、handler.sendMessage(message)向主线程传输多个类型数据,包括list<Map<String,Object>>