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

news/2024/7/7 7:51:56

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

可以使用继承来减少重复的代码。只有代码少了,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),这种能力被称为多态性。

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

转载于:https://www.cnblogs.com/ccyag/p/8902281.html


http://www.niftyadmin.cn/n/4557991.html

相关文章

C语言 数据结构题目一道 在线等答案~快~试写一符合上述要求的LocateNode运算的算法。

答案补充 晕还只能传一幅图 x){//从表头向后查找值为x的节点Node *p L;while(p->data ||| 就按你所说的顺序写代码不就成了 一个IF 一个排序 LocateNode(L 修改下 建议程序自己多写写 NULL) { //断开p在链表中的连接 p->prior->next p->next; p->next->pr…

thinphp5框架遇到 mkdir() Permission denied 解决办法

网站重装 直接复制本地程序文件 里面数据库链接信息要改成线上的 然后mysql apache 等都没有动 运行后出现错误 mkdir() Permission denied 这是由于runtime目录没有权限导致的 解决办法 chown -R apache runtime 这个就是把runtime目录给用户apache 要在当前目录下才行 目录…

Ubuntu16 编译源码安装MXNet 可变卷积Deformable-ConvNets GPU版

【引言】最近接手了公司的关于虫子识别的项目,使用MXNet框架开发,但是实际用的是Deformable-ConvNets. Deformable-ConvNets为微软研究研究院提出的可变卷积网络,可用于对图像中大小不一的物体识别,不是单单识别图中的猫和狗&…

托盘与热键问题

托盘状态后获取下焦点试试 你检查下你的程序 可能程序变为托盘状态的时候失去焦点了

什么时候开课 电子系学C语言吗

||| 要的 电子学单片机要用C语言 大概大二开课 俺们以前也是学电子的 应该是大一就开课吧 这是基础 ||| 学~大一第二学期吧~我是大一第二学期学的 ||| 应该要学的 在大一下的时候学的VC