一起Talk IOS吧(第十九回 OC中方法的重写)

2024-03-12 03:48

本文主要是介绍一起Talk IOS吧(第十九回 OC中方法的重写),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看官们,我们在上一章回中通过具体的代码演示了如何使用继承,带着上一章回末尾的问题,本章回中将介绍方法的重写。

方法的重写通常发生在类继承的过程中,具体表现为子类中定义的方法和父类中某个方法相同,或者说子类和父类中拥有相同名字的方法。接下来我们通过具体的代码说明。

#import<Foundation/Foundation.h>//定义父类Phone,类中包含两个属性和一个方法
@interface Phone : NSObject@property char * name;
@property int size;-(void) makeCall;
@end//实现父类Phone。主要是实现了init和makeCall方法
@implementation Phone@synthesize name;@synthesize size;-(instancetype) init {self = [super init];if(self) {name = "this is phone";size = 0;	}return self;}-(void) makeCall {NSLog(@"Phone makeCall");}
@end@interface AndroidPhone : Phone
-(void) os;
@end@implementation AndroidPhone-(instancetype) init {self = [super init];if(self) {[super setName:"this is AndroidPhone"];[super setSize:7];}return self;}-(void) os {NSLog(@"this is AndroidPhone");}@end//定义子类IPhone,继承自父类:Phone。子类定义了appleID属性和os方法
@interface IPhone : Phone
@property char* appleID;
-(void) os;@end@implementation IPhone @synthesize appleID;-(instancetype) init {self = [super init];if(self) {appleID = "001";//不能直接使用父类的的成员,因为其此成员拥有私有权限。需要通过设置方法来修改父类成员的值// name = "this is IPhone";// size = 6;[super setName: "this is IPhone"];[super setSize:6];}return self;}-(void) os {NSLog(@"this is IOS");
}-(void) makeCall {NSLog(@"IPhone makeCall");
}@endint main() {NSLog(@"this is main application");Phone *phone = [[Phone alloc] init];IPhone *iPhone = [[IPhone alloc] init];AndroidPhone *aPhone = [[AndroidPhone alloc] init];[phone makeCall];NSLog(@"Name: %s, size: %d",phone.name,phone.size);[iPhone os];[iPhone makeCall];NSLog(@"Name: %s, size: %d,appleID: %s",iPhone.name,iPhone.size,iPhone.appleID);[aPhone os];[aPhone makeCall];NSLog(@"Name: %s, size: %d",aPhone.name,aPhone.size);
}

上面的代码中,我们定义了父类Phone和子类AndroidPhone。这部分代码我们在上一章回中介绍过,因此这里不再做详细介绍。

我们重写看一下新定义的子类IPhone,它继承了自父类Phone,拥有父类的属性和方法,在此基础上它定义了自己的属性和方法.不过makeCall方法和父类重名了,这时便发生了重写,我们通过子类对象调用makeCall方法时调用的是子类的makeCall方法而不是父类的makeCall方法,因为子类的makeCall方法覆盖了父类的makeCall方法。

我们可以做个对比,AndroidPhone也是继承自父类Phone,但是它没有重写父类的makeCall方法,因此它的对象调用makeCall方法时调用的是父类的方法。

刚才所说的对比,我们在main函数中进行了验证,下面是程序运行的结果,大家可以自己动手去验证。

另外,代码中的两个子类都定义了相同的os方法,但是此方法没有发生重写,因为父类没有相同的os方法。希望大家不要一看到相同的方法就认为是重写方法,要注意区分。

$ clang -framework Foundation oop.m -o ex.out       //把上面的代码保存为oop.m然后编译该程序
$ ./ex.out                                          //运行编译后的程序ex.out[2023:144432] this is main applicationex.out[2023:144432] Phone makeCall                  //父类Phone的方法和属性ex.out[2023:144432] Name: this is phone, size: 0ex.out[2023:144432] this is IOS                     //子类IPhone调用自己的os方法,该方法没有发生重写ex.out[2023:144432] IPhone makeCall                 //子类IPhone重写了父类的makeCall方法,调用得是自己的方法ex.out[2023:144432] Name: this is IPhone, size: 6,appleID: 001ex.out[2023:144432] this is AndroidPhone            //子类AndroidPhone调用自己的os方法,该方法没有发生重写ex.out[2023:144432] Phone makeCall                  //子类AndroidPhone没有重写父类的makeCall方法,调用的是父类的方法ex.out[2023:144432] Name: this is AndroidPhone, size: 7

最后我们对本章回的内容做一个总结:

  • 1.重写发生在类的继承体系中,表现为父类和子类拥有相同的方法;
  • 2.发生重写方法后调用的是子类的方法,父类的方法被覆盖了;
  • 3.不同子类拥有相同的方法不能称作是重写方法;

看官们,欲知后事如何且听下回分解!

这篇关于一起Talk IOS吧(第十九回 OC中方法的重写)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800054

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE