Objective-C中的面向对象编程
1.过程式编程实例,画出Shape数组中的图形:
// // 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];//CircleShapeRect rect0={0,0,10,30};shapes[0].type=kCircle;shapes[0].fillColor=kRedColor;shapes[0].bounds=rect0;//RectangleShapeRect rect1={30,40,50,60};shapes[1].type=kRectangle;shapes[1].fillColor=kGreenColor;shapes[1].bounds=rect1;//EggShapeRect 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{//定义数据成员@privateShapeColor 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{//定义数据成员 @privateShapeColor 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{//定义数据成员 @privateShapeColor 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{//定义数据成员 @privateShapeColor 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];//Circleshapes[0]=[Circle new];//这里创建新的类实例将new加在类名称的后面ShapeRect rect0={0,0,10,30};[shapes[0] setBounds:rect0];[shapes[0] setFillColor:kRedColor];//RectangleShapeRect rect1={30,40,50,60};shapes[1] =[ Rectangle new];[shapes[1] setBounds:rect1];[shapes[1] setFillColor:kGreenColor];//EggShapeRect rect2={15,18,37,29};shapes[2] =[Egg new];[shapes[2] setBounds:rect2];[shapes[2] setFillColor:kBlueColor];//TriangleShapeRect 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,解决方法如下:
将Objective-c Automatic Reference Counting 设置为No,关闭ARC即可。
转载于:https://www.cnblogs.com/zhoudayang/p/5357554.html
Objective-C中的面向对象编程相关推荐
- JS中的面向对象编程
JS中的面向对象编程 小课堂 目录 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考文献 8.更多讨论 1.背景介绍 什么是对象? ECMA-262把对象定 ...
- python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?
现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...
- VSCode自定义代码片段9——JS中的面向对象编程
JavaScript的面向对象编程 {// JS'OOP// 9 如何自定义用户代码片段:VSCode =>左下角设置 =>用户代码片段 =>新建全局代码片段文件... =>自 ...
- python如何初始化对象数组_如何理解Python中的面向对象编程?
(由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...
- 如何理解 Python 中的面向对象编程?
现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews ...
- c语言面向对象编程中的类_C ++中的面向对象编程
c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...
- 简述python中面向对象的概念_简述Python中的面向对象编程的概念
面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python中对象的概念是什么_简述Python中的面向对象编程的概念
面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python中面向对象_简述Python中的面向对象编程的概念
面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- ruby 新建对象_Ruby中的面向对象编程
ruby 新建对象 Before getting into understanding how Object-oriented programming is implemented in Ruby, ...
最新文章
- PowerShell让系统可以执行.ps1文件
- node.js Centos安装
- Ubuntu 16.04下Caffe-SSD的应用(三)——训练VOC2007数据生成模型
- HDU4135 HDU2841 HDU1695 求[1,m]中与n互素的数的个数
- TensorFlow模型实现:UNet模型
- client copy sap论坛上看到的
- 100篇论文串讲对话系统前世今生
- 新词新意—The Sticks 乡下
- JSK-127 进制转换【进制】
- 通过命令行启动uwp应用
- Linux环境下安装Hadoop(完全分布式)
- VARCHART XGantt 甘特图用程序应该如何交付
- 吉利远景 SUV 升级车机系统 MCU 及 SPD 的一些问题
- 沃尔玛经典营销案例:啤酒与尿布
- 手机浏览器查看控制台
- 36个excel技巧、50个快捷键
- Redis集群单点故障:corrupted cluster config file.
- android7.1 科大讯飞语音引擎设置为首选引擎
- 大数据技术怎么自学?大数据开发如何自学?
- 复旦赵卫东:大数据的系统观