OC基础语法快速浏览2--继承

2018-06-15  本文已影响0人  心明道长

继承

在OC中,继承的语法格式。其实,在之前几篇博文中已经看到。声明一个类的时候,@interface Circle :NSObject。这里的冒号,就是继承的标示符,冒号后面的NSObject就是要继承的类,也就是说是父类。注:在OC中,不支持多继承。

#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;

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

/* 3. 定义Shape父类*/
@interface Shape: NSObject{
    ShapeColor fillColor;
    ShapeRect bounds;
}
-(void) setFillColor:(ShapeColor) fillColor;
-(void) setBounds:(ShapeRect) bounds;
-(void) draw;
@end //Shape

/* 实现Shape父类 */
@implementation Shape
-(void) setFillColor:(ShapeColor) c
{
    fillColor = c;
}
-(void) setBounds:(ShapeRect) b
{
    bounds = b;
}
-(void) draw{
}
@end

/*定义Circle,继承Shape父类*/
@interface Circle: Shape
@end

/*定义Rectangle,继承Shape父类*/
@interface Rectangle: Shape
@end

/*定义Egg,继承Shape父类*/
@interface Egg: Shape
@end
@implementation Circle
-(void) draw
{
    NSLog(@"drawing a circle at (%d %d %d %d) in %@",
          bounds.x,
          bounds.y,
          bounds.height,
          bounds.width,
          colorName(fillColor));
}
@end

@implementation Rectangle
-(void) draw
{
    NSLog(@"drawing a rectangle at (%d %d %d %d) in %@",
          bounds.x,
          bounds.y,
          bounds.height,
          bounds.width,
          colorName(fillColor));
}
@end

@implementation Egg
-(void) draw
{
    NSLog(@"drawing an egg at (%d %d %d %d) in %@",
          bounds.x,
          bounds.y,
          bounds.height,
          bounds.width,
          colorName(fillColor));
}
@end

在子类中重新实现了draw的方法,这个过程叫重写方法。执行的时候,如果子类中有重新定义父类中的方法,那么就会先去执行子类方法,父类中的同名方法则会别忽略。如果子类方法找不到,再去执行父类中定义的方法。

在OC中,也提供了既可以重写方法实现,又可以调用父类自身实现的方法。为了调用继承的方法在父类中出现,需要使用super作为方法调用的目标。当我们向super发送信息的时候,实际上是请求OC向该类的父类发送消息。下面就修改一个使用super关键字的例子:

@implementation Circle
-(void) setFillColor:(ShapeColor) c
{
    if(c == kRedColor)
    {
        c = kGreenColor;
    }
    [super setFillColor: c];
}
-(void) draw
{
    NSLog(@"drawing a circle at (%d %d %d %d) in %@",
          bounds.x,
          bounds.y,
          bounds.height,
          bounds.width,
          colorName(fillColor));
}
@end

假如调用的颜色是红色,则返回的是绿色。在函数的结尾处,使用super关键字,通知父类,将新的颜色存储在fillColor变量中。

上一篇 下一篇

猜你喜欢

热点阅读