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];
    //Circle
    ShapeRect rect0={0,0,10,30};
    shapes[0].type=kCircle;
    shapes[0].fillColor=kRedColor;
    shapes[0].bounds=rect0;
    //Rectangle
    ShapeRect rect1={30,40,50,60};
    shapes[1].type=kRectangle;
    shapes[1].fillColor=kGreenColor;
    shapes[1].bounds=rect1;
    //Egg
    ShapeRect 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{
    //定义数据成员
    @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=0;i<count;i++){
        id shape=shapes[i];
        [shape draw];
    }
}
int main(int argc, const char * argv[]) {

    id shapes[4];
    //Circle
    shapes[0]=[Circle new];//这里创建新的类实例将new加在类名称的后面
    ShapeRect rect0={0,0,10,30};
    [shapes[0] setBounds:rect0];
    [shapes[0] setFillColor:kRedColor];
    //Rectangle
    ShapeRect rect1={30,40,50,60};
    shapes[1] =[ Rectangle new];
    [shapes[1] setBounds:rect1];
    [shapes[1] setFillColor:kGreenColor];
    //Egg
    ShapeRect rect2={15,18,37,29};
    shapes[2] =[Egg new];
    [shapes[2] setBounds:rect2];
    [shapes[2] setFillColor:kBlueColor];
    //Triangle
    ShapeRect 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即可。

时间: 2024-11-01 11:46:45

Objective-C中的面向对象编程的相关文章

Lua语言基础汇总(12)-- Lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 1 2 3 4 5 6 7 8 9 10 11 12 local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 pri

lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的.我在<Lua中的模块与包>中也总结了,我们是基于table来实现的模块,在table中可以定义函数,也就是说,每个table对象都可以拥有其自己的操作.看一段代码: 上面的代码创建了一个新函数,并将该函数存入Account对象的withDraw字段中,然后我们就可以调用该函数了.不过,在函数中使

python中的面向对象编程

在python中几乎可以完成C++里所有面向对象编程的元素. 继承:python支持多继承: class Derived(base1, base2, base3): pass 多态:python中的所有实例方法都是virtual类型的 封装: 这个比较特殊,C++编程中一直强调得比较多的是:为了隐藏实现,所有的成员变量都要是private类型的,还有那些仅与实现相关的,不作为外部接口的方法都要定义成private类型的(或者protected).但是在python里面,并不存在真正的私有类型,根

深入理解javascript中实现面向对象编程方法

介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是复制栈上的信息,这样就会出现以下情况,如果变量是对象,那么这一操作,复制的只是真正对象所在 的堆内存空间的起始地址,这就是所谓的浅拷贝,如果是深拷贝,则是在内存堆空间中重新分配一个内存,并把分配的内存的起始地址复制过去. 2. 引用类型数据和值类型数据:谈到引用类型数据和值类型数据,自然而然的联想到

Perl中的面向对象编程

一.模块简介 模块(module)就是Perl包(package).Perl的对象基于对包中数据项的引用. 在用其它语言进行面向对象编程时,先声明一个类然后创建该类的对象(实例),特定类所有对象的行为方式是相同的,由类方法确定,可以通过定义新类或从现存类继承来创建类. 类是一个Perl包,其中包含提供对象方法的类: 方法是一个Perl子程序,类名是其第一个参数: 对象是对类中数据项的引用. 二.Perl中的类 一个Perl类是一个包.Perl5用双冒号(::)来标识基本类和继承类(之类). Pe

JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)

面向对象编程: 面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求 面向过程编程: 按照我们分析好的步骤,按步骤解决问题 优点:性能比面向对象高,适合跟硬件联系很紧密的东西 缺点:没有面向对象那么容易维护,复用,扩展 面向对象编程: 把事务分解成一个个对象,然后由对象之间分工与合作,分工明确,每一个对象都是功能中心 面向对象特性:封装性.继承性 .多态性 封装性:将一个功能封装起来,小封装 将多个函数封装起来,整体封装起来形成一个

JavaScript 中的面向对象编程

使用JSON 来定义一个对象: <script type="text/javascript">var xiaoming = { name : 'xiaoming', age : 18, say : function(){ console.log('my name is '+this.name); }}xiaoming.say();xiaoming.name = 'li xiao ming';xiaoming.say();</script>  

echarts中js面向对象编程

function fetchData(cb) { // 通过 setTimeout 模拟异步加载 setTimeout(function () { cb({ categories: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"], data: [5, 20, 36, 10, 10, 20] }); }, 1000);} // 初始 optionoption = {

如何理解并学习javascript中的面向对象(OOP) [转]

如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript面向对象,否则你无法更灵活的使用javascript这门语言. 什么事闭包?到底什么是原型?(知道闭包和原型的,就算得上是javascript的高手了.但真正能够理解,并且灵活运用的人并不多)到底该如何学习javascript中的面向对象呢?在javascript这么语言正如日中天,相信不少人正在为