Object C学习笔记23-继承,重写,重载-阿里云开发者社区

开发者社区> 贺臣情缘> 正文

Object C学习笔记23-继承,重写,重载

简介:   前面的学习都一直在使用Object C对象,但是没有具体总结过Object C中的对象使用特性,这里简单总结一下。   一.  继承     在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在Object C中也同样如此。
+关注继续查看

  前面的学习都一直在使用Object C对象,但是没有具体总结过Object C中的对象使用特性,这里简单总结一下。

  一.  继承

    在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在Object C中也同样如此。

    先定义一个Person类,并且定义几个属性和一个方法:

#import <Foundation/Foundation.h>

@interface Person : NSObject{
    NSString *name;
    int age;
    NSArray *itmes;
}
@property (nonatomic,retain) NSString *name;
@property (nonatomic,assign) int age;
@property (nonatomic,retain) NSArray *itmes;

-(void) write;
@end
Person类的定义

    在上面的代码中,Person类定义了三个属性name,age,items,对应的类型分别为NSString,int,NSArray. 其中还有一个方法write,返回值类型为void,没有输入参数。其具体描述内容如下:

#import "Person.h"

@implementation Person

@synthesize name;
@synthesize age;
@synthesize itmes;

-(void) write{
    NSLog(@"%d",self.age);
    NSLog(@"Person 对象调用write方法");
}

@end
Person类

    在write方法中我们可以看到输出了age,并且输出一个字符串,这里又来标识具体调用哪个方法。

    再顶一个Student类,继承Person类,在Person类中定义一个属性address,为NSString类型,并且定义一个方法eat,返回值类型为void,没有输入参数,具体的代码如下:

#import <Foundation/Foundation.h>
#import "Person.h"

@interface Student : Person{
    NSString *address;
}
@property (nonatomic,retain) NSString *address;

-(void) eat;

@end

-------------------------------------------------------------------
#import "Student.h"

@implementation Student
@synthesize address;

-(void) eat{
    NSLog(@"Student 调用eat方法");

}

@end
Student类

    通过如上代码,Student就继承了Person类的属性和方法。

Person *person=[[Person alloc] init];
        person.age=43;
        [person write];
        Student *student=[[Student alloc] init];
        student.address=@"上海";
        student.age=99;
        [student eat];
        [student write];
测试代码

    输出如下结果:

2014-04-05 13:25:30.990 ObjectCApress[1659:303] 43
2014-04-05 13:25:30.992 ObjectCApress[1659:303] Person 对象调用write方法
2014-04-05 13:25:30.993 ObjectCApress[1659:303] Student 调用eat方法
2014-04-05 13:25:30.994 ObjectCApress[1659:303] 99
2014-04-05 13:25:30.995 ObjectCApress[1659:303] Person 对象调用write方法

    通过以上代码我们可以看出,Student继承了父类Person的属性和方法。

 

  二. 重写

    在调用对象继承方法的时候,调用和执行的是基类的实现.但是,有时需要对派生类中的继承方法有不同的实现.这个时候我们就需要重写父类方法,但是在Object C中重写和.NET中的重写有点区别,不需要使用特殊的关键字标识。

    在Object C重写父类方法,只需要重新实现该方法即可,代码如下:

#import <Foundation/Foundation.h>
#import "Person.h"

@interface Student : Person{
    NSString *address;
}
@property (nonatomic,retain) NSString *address;

-(void) eat;

@end

-------------------------------------------------
#import "Student.h"

@implementation Student
@synthesize address;

-(void) eat{
    NSLog(@"Student 调用eat方法");

}

-(void) write{
    NSLog(@"调用Student的Write方法");
}

@end
重写父类方法

    在上面的代码中看出Student.m类中有一个write方法,其就是重写父类方法,不需要使用任何其他的修饰符。在上面的代码我们测试得到如果student类调用write 方法,其实是调用父类的方法,这里Student再调用write方法看看:

Student *student=[[Student alloc] init];
        student.address=@"上海";
        student.age=99;
        [student eat];
        [student write];

    输出结果如下:

2014-04-05 13:36:21.055 ObjectCApress[1698:303] Student 调用eat方法
2014-04-05 13:36:21.058 ObjectCApress[1698:303] 调用Student的Write方法

    结果输出"调用Student的write方法",说明这里不是调用的父类方法了

 

  三. 在子类调用父类方法

    在.NET中我们可以使用super关键字来调用,在在Object C中也可以使用super 来调用父类的方法。

-(void) write{
    NSLog(@"调用Student的Write方法");
    [super write];
}

    修改Student.m中的write方法,在这个方法中添加[super write] 语句用来调用父类的write方法。输出结果如下:

2014-04-05 15:14:28.164 ObjectCApress[1815:303] Student 调用eat方法

2014-04-05 15:14:28.167 ObjectCApress[1815:303] 调用StudentWrite方法

2014-04-05 15:14:28.168 ObjectCApress[1815:303] 99

2014-04-05 15:14:28.168 ObjectCApress[1815:303] Person 对象调用write方法

    同样使用以上代码来测试,得到如上输出的结果,从结果中我们可以看得出,使用super调用了父类方法。

 

  四. 重载

    .NET中重载就是方法名相同而输入参数不一样,在Object C中并没有重载。

-(void) eat;
-(void) eat(int a);

    我们尝试使用.NET的那种方式重载方法,如上代码,使用编译器编译报错,因为Object C中不支持方法的重载。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在GitLab CI/CD中使用environment对部署环境进行管理
在GitLab CI/CD中使用environment对部署环境进行管理 关键词environment的详细解释
8 0
01_spring_ 简介| 学习笔记
快速学习01_spring_ 简介
10 0
styleGAN环境搭建 、 动漫模型效果测评
styleGAN环境搭建 、 动漫模型效果测评
5 0
【大数据组件】一篇文章让你快速入门Docker
Docker 是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
18 0
无影云畅享
“无影是阿里云打造的云端一体、安全高效的一站式云上办公空间。无影的云桌面、云应用、应用中心、安全浏览器等一系列的云办公能力,通过流化的技术,提供给终端用户,在算力、安全、成本、敏捷、开放等方面,无影具有超越传统PC的优势。”
15 0
【技术干货】40页PPT分享万亿级交易量下的支付平台设计(6)
【技术干货】40页PPT分享万亿级交易量下的支付平台设计(6)
15 0
SpringBoot使用Junit5
SpringBoot使用Junit5
6 0
对于操作系统而言进程、线程以及Goroutine协程的区别
进程、线程、协程实际上都是为并发而生。但是他们的各自的模样是完全不一致的,下面我们来分析一下他们各自的特点和关系。本文不重点介绍什么是进程和线程,而是提炼进程、线程、协程干货。且是基于Linux下的进程、线程解释。
4 0
【技术干货】40页PPT分享万亿级交易量下的支付平台设计(4)
【技术干货】40页PPT分享万亿级交易量下的支付平台设计(4)
8 0
kafka日志写入logstash
kafka日志写入logstash
5 0
+关注
贺臣情缘
游历IT界多年颇有心得,非传说中的技术大牛。致力于仓储管理软件方面的开发
200
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载