《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.外部类要访问内部类,必须建立内部类对象 ...
随机推荐
- exce中42093和日期之间的关系
在EXECEL中数字0 代表日期 1900-1-0 ,即这个日期为起始日期,算是第0天数字1 代表日期 1900-1-1 ,即第一天数字2 代表日期 1900-1-2 ,即第二天......数字415 ...
- 解决springboot druid 数据库批量更新错误问题
原文:https://www.2cto.com/kf/201712/706399.html springboot druid 数据库多SQL错误multi-statement not allow Ca ...
- 将 LDAP 目录用于 Samba 认证
原文地址: http://www.ibm.com/developerworks/cn/education/linux/smb-ldap/smb-ldap.html 开放源码 Samba 将 Unix ...
- 64位电脑上启动程序出现丢失MSVCR110.dll的解决办法
启动程序报错如下: 无法启动此程序,因为计算机中丢失MSVCR110.dll.尝试重新安装该程序以解决此问题. 应该很容易就搜索到,缺少这样的dll文件,是没有安装Visual C++ Redistr ...
- [Spring Unit Testing] Spring Unit Testing with a Java Context
For example, we want to test against a implemataion: package com.example.in28minutes.basic; import o ...
- 解决 Docker pull 出现的net/http: TLS handshake timeout 的一个办法
echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"&q ...
- zabbix 中文乱码的处理
一.乱码原因 查看cpu负载,中文乱码如下 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 二.解决zabbix乱码方法 2.1 上传字体文件到zabbix中 找到本地 ...
- 如何生成唯一的server Id,server_id为何不能重复?
我们都知道MySQL用server-id来唯一的标识某个数据库实例,并在链式或双主复制结构中用它来避免sql语句的无限循环.这篇文章分享下我对server-id的理解,然后比较和权衡生成唯一serve ...
- 云主机IO性能测试
1:数据读取速度 ucloud云主机最低224.8MB/S,最高508.8MB/S,平均410.7MB/S 阿里云主机最低17.4MB/S, 最高189.6MB/S,平均170.6MB/S ...
- WineBottler for Mac(Mac 运行 exe 程序工具)安装
1.软件简介 WineBottler 是 macOS 系统上一款模拟 Windows 环境的工具,让你能够在 Mac 上安装 Windows 软件,类似于知名的 Crossover,但 Wine ...