美文网首页
Objective-C之面向对象(一)

Objective-C之面向对象(一)

作者: 吟风划彩虹 | 来源:发表于2017-10-10 14:55 被阅读0次

下面采用的事例是取自《Objective-C基础教程》一书中。

关于面向对象

  其实如果之前有学习过C++或者Java的话,那其实面向对象的概念对你来说肯定不陌生,Objective-C里面的OOP也是相类似的概念,无非就是封装、继承、多态等等。下面通过一个关于“形状”的例子来记录一下。
  假设我们想在屏幕上绘制圆形,矩形等一些形状,那我们需要先定义一下形状的类型,颜色,位置等信息,如下:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;  //形状

typedef enum {
    kRedColor,
    kGreenColor,
    kBlueColor
} ShapeColor;  //颜色

typedef struct
{
    int x, y, width, height;
} ShapeRect;  //位置

然后再将其封装为一个Shape类型的结构体,如下:

typedef struct
{
    ShapeType type;
    ShapeColor fillColor;
    ShapeRect bounds;
} Shape;

这样形状类型就定义好了,我们再来定义一下绘制函数,即在控制台输出信息:

void drawCircle(ShapeRect bounds, ShapeColor color)
{
    NSLog(@"draw a circle at ( %d %d %d %d ) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(color));
}

void drawRectangle(ShapeRect bounds, ShapeColor color)
{
    NSLog(@"draw a rectangle at ( %d %d %d %d ) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(color));
}

void drawOblateSpheroid(ShapeRect bounds, ShapeColor color)
{
    NSLog(@"draw a OblateSpheroid at ( %d %d %d %d ) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(color));
}

可以看到,这三个绘制函数的结构是完全一样的,就是输出的内容稍有改动,其中colorName函数定义如下:

NSString *colorName(ShapeColor color)
{
    switch (color) {
        case kRedColor:
            return @"red";
            break;
        case kGreenColor:
            return @"green";
            break;
        case kBlueColor:
            return @"blue";
            break;
        default:
            return @"no Color";
            break;
    }
    return @"no Color";
}

我们通过颜色的枚举值返回具体的颜色名称字符串(NSString类型),然后我们再定义整个函数的绘制函数:

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 kOblateSpheroid:
                drawOblateSpheroid(shapes[i].bounds, shapes[i].fillColor);
                break;
            default:
                break;
        }
    }
}

最后主函数呈上:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Shape shapes[3];
        ShapeRect rect0 = {0, 0, 10, 30};
        shapes[0].type = kCircle;
        shapes[0].fillColor = kRedColor;
        shapes[0].bounds = rect0;
        
        ShapeRect rect1 = {10, 30, 20, 40};
        shapes[1].type = kRectangle;
        shapes[1].fillColor = kGreenColor;
        shapes[1].bounds = rect1;
        
        ShapeRect rect2 = {20, 40, 30 ,50};
        shapes[2].type = kOblateSpheroid;
        shapes[2].fillColor = kBlueColor;
        shapes[2].bounds = rect2;
        
        drawShapes(shapes, 3);
    }
    return 0;
}

我们定义了一个shape类型的数组,里面包含三个元素,设置不同的类型,颜色以及位置,然后通过drawShapes函数输出结果,虽然程序可以成功运行,但是缺点也很明显,比如我要添加一个新的形状的话就要重新定义,而且drawShapes设计过于复杂,不符合多态的设计原则,下一节我们先将程序转化为Objective-C的代码,让其符合多态的规则。

相关文章

网友评论

      本文标题:Objective-C之面向对象(一)

      本文链接:https://www.haomeiwen.com/subject/zrbvyxtx.html