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中的面向对象编程相关推荐

  1. JS中的面向对象编程

    JS中的面向对象编程 小课堂 目录 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考文献 8.更多讨论 1.背景介绍 什么是对象? ECMA-262把对象定 ...

  2. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...

  3. VSCode自定义代码片段9——JS中的面向对象编程

    JavaScript的面向对象编程 {// JS'OOP// 9 如何自定义用户代码片段:VSCode =>左下角设置 =>用户代码片段 =>新建全局代码片段文件... =>自 ...

  4. python如何初始化对象数组_如何理解Python中的面向对象编程?

    (由Python大本营付费下载自视觉中国) 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 现如今面向对象编程的使用非常广泛,本文 ...

  5. 如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews ...

  6. c语言面向对象编程中的类_C ++中的面向对象编程

    c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...

  7. 简述python中面向对象的概念_简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  8. python中对象的概念是什么_简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  9. python中面向对象_简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  10. ruby 新建对象_Ruby中的面向对象编程

    ruby 新建对象 Before getting into understanding how Object-oriented programming is implemented in Ruby, ...

最新文章

  1. PowerShell让系统可以执行.ps1文件
  2. node.js Centos安装
  3. Ubuntu 16.04下Caffe-SSD的应用(三)——训练VOC2007数据生成模型
  4. HDU4135 HDU2841 HDU1695 求[1,m]中与n互素的数的个数
  5. TensorFlow模型实现:UNet模型
  6. client copy sap论坛上看到的
  7. 100篇论文串讲对话系统前世今生
  8. 新词新意—The Sticks 乡下
  9. JSK-127 进制转换【进制】
  10. 通过命令行启动uwp应用
  11. Linux环境下安装Hadoop(完全分布式)
  12. VARCHART XGantt 甘特图用程序应该如何交付
  13. 吉利远景 SUV 升级车机系统 MCU 及 SPD 的一些问题
  14. 沃尔玛经典营销案例:啤酒与尿布
  15. 手机浏览器查看控制台
  16. 36个excel技巧、50个快捷键
  17. Redis集群单点故障:corrupted cluster config file.
  18. android7.1 科大讯飞语音引擎设置为首选引擎
  19. 大数据技术怎么自学?大数据开发如何自学?
  20. 复旦赵卫东:大数据的系统观

热门文章

  1. Hibernate入门这一篇就够了
  2. MyEclipse 10, 2013, 2014 破解、注册码
  3. 用户界面的一些好的设计理念
  4. MySql 你真的会使用字符串索引吗???
  5. Flutter Scaffold组件详情配制使用
  6. java基础—System类的方法演示
  7. 获取0~100之间的随机数
  8. Docker04-镜像
  9. java类与对象(属性,方法)的使用
  10. 2018-2019-2 20165209 《网络对抗技术》Exp3:免杀原理与实践