ojective-C学习笔记(6)继承

在学习的上一个小程序中,有几个类的接口和实现都非常的相似,我是通过复制粘贴的方式来编写的。

可以使用继承来减少重复的代码。只有代码少了,bug才无处藏身。

OC是单一继承,可以使用OC的其他特性来达到多继承的效果,这个以后会学到的,不用着急。

有关继承的术语

超类(super class):是被继承的类。
父类(parent class):是超类的另一种叫法。
子类(subclass):是执行继承的类。
孩子类(child class):是子类的另一种叫法。

个人倾向于父类/子类这一组称呼。

重写(override):改变父类已有方法的实现,代码运行时,OC会确保调用的是重写后的方法。

我们将上一个程序使用继承做一个简单的重构。

首先,创建一个父类Shape。

接口文件


@interface Shape : NSObject{
    ShapeColor color;
    ShapeRect bounds;
}

- (void)setColor:(ShapeColor) color;
- (void)setBounds:(ShapeRect) bounds;
- (void)draw;
- (NSString *)colorName:(ShapeColor) color;

@end

实现文件

@implementation Shape

- (void)setColor:(ShapeColor)c{
    color = c;
}

- (void)setBounds:(ShapeRect)b{
    bounds = b;
}

- (NSString *)colorName:(ShapeColor) color{
    switch (color) {
        case kRed:
            return @"red";
            break;
        case kGreen:
            return @"green";
            break;
        case kBlue:
            return @"blue";
            break;
    }
}

- (void)draw{
    
}

@end

将其他几个类继承Shape类,然后重写draw方法。
修改后的Circle类:

接口文件空空如也,bug无处藏身。

@interface Circle : Shape

@end

在实现文件中重写父类中的draw方法。[super colorName:color]调用父类中的方法,获取颜色名称。Rectangle和Triangle类的修改类似。

@implementation Circle

- (void)draw{
    NSLog(@"drawing a circle at (%d %d %d %d) in %@",
          bounds.x, bounds.y, bounds.widht, bounds.height, [super colorName:color]);
}

@end

使用继承后,重复的代码减少了,扩展和维护变得更加简单。

继承是实现多态性的重要基础,使用更具体种类的对象(Circle或者Rectangle)来代替一般类型(Shape),这种能力被称为多态性。

面向对象编程中,除了继承,复合也是非常重要的,它是让不同对象协同工作的另一种方式,接下来将学习有关复合的知识。

posted @ 2018-04-21 17:09  陈道长  阅读(126)  评论(0编辑  收藏  举报