《objective-c基础教程》学习笔记(三)—— 从结构体到面向对象
一听标题,感觉十分的抽象。面向对象就是(Object-Oriented Programming)的首字母缩写:OOP,是当今最主流的编程方法。
那么,面向对象编程具体有什么好处呢。是如何来实现呢?通过下面的实例,我想可以给大家最简单直观的理解了。
好了,下面就来说说我们这篇博文主要要介绍的内容吧。今天,我们通过一个绘制几何图形的实例来介绍基本的面向对象思想。
首先我们,新建一个Command Tools的命令行工具项目,选择Foundation头文件。
/
// main.m
// ch3_OOP_Shapes
//
// Created by pcbeta on 14-11-18.
// Copyright (c) 2014年 julian. All rights reserved.
// 面向对象的基本实例,绘制几个几何图形 #import <Foundation/Foundation.h>
/* 1. enum 枚举类型 */
//定义绘制图形的类型: 圆形,矩形,椭圆形
typedef enum{
kCircle,
kRectangle,
kEgg
} ShapeType; //定义绘制图形的颜色: 红色,绿色和蓝色
typedef enum{
kRedColor,
kGreenColor,
kBlueColor
} ShapeColor; /* 2. struct 结构体 */
//定义图形的基本属性
typedef struct{
int x, y, width, height;
} ShapeRect; //定义整体描述的形状
typedef struct{
ShapeType type;
ShapeColor color;
ShapeRect bounds;
} Shape;
如上面的代码所示,我们定义了两个枚举类型的变量,和两个结构图的变量。接下来,我们在main主函数中声明要绘画的几何图形数组。
分别定义了一个红色圆形,一个绿色矩形和一个蓝色椭圆型。
// 定义三个几何图形的数组
Shape shapes[];
// 定义第一个几何图形为 红色的圆形,
ShapeRect rect0 ={,,,};
shapes[].type = kCircle;
shapes[].fillColor = kRedColor;
shapes[].bounds = rect0; // 定义第一个几何图形为 绿色的矩形,
ShapeRect rect1 ={,,,};
shapes[].type = kRectangle;
shapes[].fillColor = kGreenColor;
shapes[].bounds = rect1; // 定义第一个几何图形为 蓝色的椭圆形,
ShapeRect rect2 ={,,,};
shapes[].type = kEgg;
shapes[].fillColor = kBlueColor;
shapes[].bounds = rect2;
接下来,我们要定义每个几个图形的画图函数了。
/* 3.定义获取颜色名称的函数 */
NSString *colorName (ShapeColor fillColor)
{
switch(fillColor)
{
case kRedColor:
return @"red";
break;
case kGreenColor:
return @"green";
break;
case kBlueColor:
return @"blue";
break;
}
} /* 4.定义几何画图方法 */
// 定义一个画圆的方法
void drawCircle(ShapeRect bounds, ShapeColor fillColor)
{
NSLog(@"Drawing a circle at (%d %d %d %d) in %@",
bounds.x,
bounds.y,
bounds.height,
bounds.width,
colorName(fillColor));
}
// 定义一个画矩形的方法
void drawRectangle(ShapeRect bounds, ShapeColor fillColor)
{
NSLog(@"Drawing a rectangle at (%d %d %d %d) in %@",
bounds.x,
bounds.y,
bounds.height,
bounds.width,
colorName(fillColor));
}
// 定义一个画椭圆的方法
void drawEgg(ShapeRect bounds, ShapeColor fillColor)
{
NSLog(@"Drawing a egg at (%d %d %d %d) in %@",
bounds.x,
bounds.y,
bounds.height,
bounds.width,
colorName(fillColor));
}
这时,我们可以再定义一个总的画图方法。可以循环输出集合数组中不同类型的图形。代码如下:
//定义一个总的画图方法
void drawShape(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;
}
}
}
最后,我们来写main主函数。整合后,实现的代码如下:
int main(int argc, const char * argv[])
{
// 定义三个几何图形的数组
Shape shapes[];
// 定义第一个几何图形为 红色的圆形,
ShapeRect rect0 ={,,,};
shapes[].type = kCircle;
shapes[].fillColor = kRedColor;
shapes[].bounds = rect0; // 定义第二个几何图形为 绿色的矩形,
ShapeRect rect1 ={,,,};
shapes[].type = kRectangle;
shapes[].fillColor = kGreenColor;
shapes[].bounds = rect1; // 定义第三个几何图形为 蓝色的椭圆形,
ShapeRect rect2 ={,,,};
shapes[].type = kEgg;
shapes[].fillColor = kBlueColor;
shapes[].bounds = rect2; drawShape(shapes, );
return ;
}
运行后的结果如下:

好了,例子写到这里。大家似乎看出点什么来了么?这里面的Shape其实就是一个简单的对象。他有ShapeTpye, ShapeColor, ShapeRect 这些属性。可以定义这个几何图形是什么类型,什么颜色,长宽高是什么。下篇博文,我们会仔细讲解面向对象编程的方法和概念。
《objective-c基础教程》学习笔记(三)—— 从结构体到面向对象的更多相关文章
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- Python基础教程学习笔记:第一章 基础知识
Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...
- Swift 学习笔记 (类和结构体)
类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...
- C#学习笔记05--枚举/结构体
一.枚举 当变量的取值范围是固定的几个时, 就可以使用枚举类型, 这样会更加简洁方便 1.1.定义: 访问修饰符 enum 枚举类型名 { 成员1, 成员2, 成员3, ... } publi ...
- matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段
一起来学matlab-matlab学习笔记12 12_2 结构体 创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段 觉得有用的话 ...
- 【学习笔记】Python基础教程学习笔记
教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...
- 匿名内部类--毕向东java基础教程学习笔记
1.匿名内部类其实就是内部类的简写形式. 2.定义匿名内部类的前提: 该内部类必须继承一个类,或者实现一个接口. 3.匿名内部类的格式:new 父类名或接口名(){定义子类内容:} 4.其实匿名内部类 ...
- 《嵌入式Linux基础教程学习笔记一》
常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...
- 内部类--毕向东Java基础教程学习笔记
内部类的访问规则 1. 内部类可以直接访问外部类的成员,包括私有. 之所以可以直接访问外部类的成员,是因为内部类中持有外部类的引用,格式:外部类名.this 2.外部类要访问内部类,必须建立内部类对象 ...
随机推荐
- Oracle取月份-不带前面的0
出处:http://www.2cto.com/database/201208/145611.html 今天碰到只要取月份和天数,如果月份前面有0要去掉0.比如说2010-01-08 ,需要的结果是 ...
- JNI编程实现(Linux)
JNI是Java Native Interface的缩写,是Java平台的本地调用,从Java1.1就成为了Java标准的一部分,它允许Java代码和其它语言的代码进行互相调用,只要调用约定支持即可, ...
- Nodejs后台管理员登录实例
思路: 直接访问后台页面时如果无session则跳转到404 当在登录页的表单提交时对数据库进行匹配,匹配成功生成session,否则提示用户名或密码错误 准备页面 :后台首页.登录页.404页, 步 ...
- Error-MVC:HTTP Error 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。
ylbtech-Error-MVC:HTTP Error 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 1.返回顶部 1. IIS ...
- Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...
- HTML5新特性[ Notifications ] 桌面消息
在执行完以上代码后,我们就成功地创建了一个消息框实例,在Chrome下面它最终会显示成这样: 到这里我们已经成功了一半,但能不能正确地显示出这个消息框,最终还取决于用户的授权.鉴于浏览器的安全机制,只 ...
- 使用sshfs挂载远程服务器目录
点击访问原文 您还可以加入全栈技术交流群(QQ群号:254842154) 服务器日志查看,是开发人员和服务器运维人员在工作中经常会遇到的一件事情,只有一台服务器时,比较好办,直接登录服务器使用tail ...
- 教育单元测试mock框架优化之路(中)
转载:https://sq.163yun.com/blog/article/169564470918451200 三.间接依赖的bean的mock替换 对于前面提供的@Mock,@Spy+@Injec ...
- Spark GraphX实例(3)
7. 图的聚合操作 图的聚合操作主要的方法有: (1) Graph.mapReduceTriplets():该方法有一个mapFunc和一个reduceFunc,mapFunc对图中的每一个EdgeT ...
- Memcache及telnent命令具体解释
1.启动Memcache 经常使用參数 memcached 1.4.3 -p <num> 设置port号(默认不设置为: 11211) -U <num> U ...