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=;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[];
//Circle
ShapeRect rect0={,,,};
shapes[].type=kCircle;
shapes[].fillColor=kRedColor;
shapes[].bounds=rect0;
//Rectangle
ShapeRect rect1={,,,};
shapes[].type=kRectangle;
shapes[].fillColor=kGreenColor;
shapes[].bounds=rect1;
//Egg
ShapeRect rect2={,,,};
shapes[].type=kEgg;
shapes[].fillColor=kBlueColor;
shapes[].bounds=rect2;
//画出数组Shape中的图形
drawShapes(shapes,);
}
基于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=;i<count;i++){
id shape=shapes[i];
[shape draw];
}
}
int main(int argc, const char * argv[]) { id shapes[];
//Circle
shapes[]=[Circle new];//这里创建新的类实例将new加在类名称的后面
ShapeRect rect0={,,,};
[shapes[] setBounds:rect0];
[shapes[] setFillColor:kRedColor];
//Rectangle
ShapeRect rect1={,,,};
shapes[] =[ Rectangle new];
[shapes[] setBounds:rect1];
[shapes[] setFillColor:kGreenColor];
//Egg
ShapeRect rect2={,,,};
shapes[] =[Egg new];
[shapes[] setBounds:rect2];
[shapes[] setFillColor:kBlueColor];
//Triangle
ShapeRect rect3 ={,,,};
shapes[] =[Triangle new];
[shapes[] setBounds:rect3];
[shapes[] setFillColor:kGreenColor];
//画出数组Shape中的图形
drawShapes(shapes,);
return ;
}
可见利用OOP编程方式,增加新的图形更加简单,修改的地方更少。
请注意object-c中的接口,类的定义以及类方法的调用,这里与C++还是存在很多的不同。
可能会遇到错误:Must explicitly describe intended ownership of an object array parameter,解决方法如下:

将Objective-c Automatic Reference Counting 设置为No,关闭ARC即可。
Objective-C中的面向对象编程的更多相关文章
- Python 中的面向对象编程
面向对象编程(Object-oriented programming, OOP)是一种基于对象概念的编程范式,可包含属性(attribute)形式的数据以及方法(method)形式的代码.另一种对 O ...
- 深入理解javascript中实现面向对象编程方法
介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是 ...
- python中的面向对象编程
在python中几乎可以完成C++里所有面向对象编程的元素. 继承:python支持多继承: class Derived(base1, base2, base3): pass 多态:python中的所 ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- Python 第六篇(中):面向对象编程中级篇
面向对象编程中级篇: 编程思想概述: 面向过程:根据业务逻辑从上到下写垒代码 #最low,淘汰 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 #混口饭吃 def add(ho ...
- lua中的面向对象编程
简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的 ...
- 深入解读 Js 中的面向对象编程
前言:今天看了一篇文章觉得很不错,所以给大家分享一下,也许很多人都看过面向对象编程甚至写过这样博客,觉得面向对象编程就那样,没啥好说的,那可能是因为你对这方面知识已经了解,可以选择性跳过.那如果有更通 ...
- 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程
声明:本篇文章仅仅以游戏<绝地求生>作为一个参考话题来介绍面向对象编程,只是作为学术引用,其制作的非常简易的程序也不会作为商业用途,与蓝洞公司无关. <绝地求生>最近很火,笼络 ...
- JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)
面向对象编程: 面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求 面向过程编程: 按照我们分析好的步骤,按步 ...
- Lua中的面向对象编程详解
简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 复制代码代码如下: local tb1 = {a = 1, b = 2}local tb2 = {a = 1, b ...
随机推荐
- AngularJS数据建模(转载)
出处不明 我们知道,AngularJS并没有自带立等可用的数据建模方案.而是以相当抽象的方式,让我们在controller中使用JSON数据作为模 型.但是随着时间的推移和项目的成长,我意识到这种建模 ...
- css 内联与块
内联元素可以理解为不能直接设置宽度和高度元素,比如span,你为他设置宽度和高度没有效果,除非你把它设置成块级元素. 如下面的代码把display:block;属性值去掉的话,宽度和高度都不会起作用了 ...
- 转 图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- ibatis中resultClass与resultMap 的区别
ibatis的resultClass与resultMap还是有很大的区别.以下是我碰到的一个问题. 配置文件写法如下: 1 sqlMap2 typeAlias alias="notice&q ...
- 归心似箭,IT达人分享抢票攻略
[51CTO专稿]随着春节一天天临近,“购票难”的问题也愈发凸显,猎豹.火狐.360等“春运抢票神器”占领了各大网站的重要版面,“技术抢票”成为炙手可热的话题,看看身为程序员的邓以克是如何抢到回家的票 ...
- 进程间通信——FIFO(多个客户进程,一个服务进程)
FIFO简介 FIFO就是Unix的一种复合POSIX标准的进程间通信机制.他又称为命名管道,跟管道的不同点是,每个FIFO都有一个路径名与之关联. FIFO虽然有路径名,但是他这中文件是在内核态(管 ...
- sitemap制作
sitemap.xml生成方法(asp和php)(转) http://teachmyself.blog.163.com/blog/static/18881422920119895435272/ sit ...
- tinkphp5.0 traits 的引入
Traits引入 ThinkPHP 5.0开始采用trait功能(PHP5.4+)来作为一种扩展机制,可以方便的实现一个类库的多继承问题. trait是一种为类似 PHP 的单继承语言而准备的代码复用 ...
- jQuery 查找带有某一属性的元素
$('*[name="username"]') 要在前面加个*表示所有的DOM,如果只是查找带有name属性的DOM的话则是这样的 $('*[name]')//其实, $('[ ...
- Zabbix的安装及简单配置
Mysql源码安装:Mysql安装脚本 PHP源码安装:基于LNMP的Zabbbix之PHP源码安装 Nginx源码安装:Nginx安装 Zabbix监控端源码安装(包含Server和Agent):l ...