下面采用的事例是取自《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的代码,让其符合多态的规则。
网友评论