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編程方式,增長新的圖形更加簡單,修改的地方更少。spa

    請注意object-c中的接口,類的定義以及類方法的調用,這裏與C++仍是存在不少的不一樣。code

    可能會遇到錯誤:Must explicitly describe intended ownership of an object array parameter,解決方法以下:blog

  

    將Objective-c Automatic Reference Counting 設置爲No,關閉ARC便可。接口

相關文章
相關標籤/搜索