Objective-C中的重载和重写详解

 更新时间:2016年11月17日 10:54:04   作者:程序员小强  
这篇文章主要介绍了Objective-C中的重载和重写详解的相关资料,开发IOS APP的好多朋友很容易搞错重载和重写,这里就详细介绍下,需要的朋友可以参考下

Objective-C 重载和重写

首先,Objective-C中不完全支持重载,网上很多人要么将重载和重写搞混,要么说OC不支持重载(当然按照重载严格定义说OC不支持重载也没错),事实上OC支持参数个数不同的函数重载。

问题: Objective-C和Swift中有重载吗?

Swift中有重载,但Objective-C中基本不支持重载。

展开:

重载、重写和隐藏三者在编程语言中的定义

重载(overload):函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。重载既可以发生在同一个类的不同函数之间,也可发生在父类子类的继承关系之间,其中发生在父类子类之间时要注意与重写区分开。

重写(override):发生于父类和子类之间,指的是子类不想继承使用父类的方法,通过重写同一个函数的实现实现对父类中同一个函数的覆盖,因此又叫函数覆盖。注意重写的函数必须和父类一模一样,包括函数名、参数个数和类型以及返回值,只是重写了函数的实现,这也是和重载区分开的关键。

隐藏:重载和重写区分开后,隐藏又有可能会跟前两者混在一起。当然OC中也没有隐藏,典型的C++中有,通过虚函数和父子类之间的函数重载进行区分,此处不再讨论。其中重载和重写是针对函数的,而隐藏除了函数还会针对成员变量。隐藏发生在父类和子类之间,隐藏指的是父类的同名函数或变量在子类中隐藏,其中只要函数同名就隐藏,不管参数相同与否。在子类中父类的同名函数或变量不可见,但在父类中依然存在。

Swift是基于C语言和OC语言优化后更加完善的新型语言,摆脱了C的兼容性限制,采用安全的编程模式并且增加了一些新的特性使编程更加有趣、友好,适应语言发展的趋势和期望。函数重载作为多态性的一个部分在Swift中是支持的,可能也是考虑到要弥补OC中不完全支持函数重载的这一缺陷。OC不完全支持重载,因为OC学习者应该会发现同一个类中不允许定义函数名相同且参数个数相同的两个函数,无论参数类型和返回值类型相同与否。但是说完全不支持也太绝对,因为OC中允许定义函数名相同但参数个数不同的两个函数,也就是说OC支持参数个数不同的函数重载。

例如,我们可以在一个类中定义两个参数个数不同的函数,调用时通过参数个数进行区分:

重载函数定义:

- (void)test:(int)one;
- (void)test:(int)one andTwo:(int)two;

重载函数实现:

- (void)test:(int)one {
  NSLog(@"one parameter!");
}


- (void)test:(int)one andTwo:(int)two {
  NSLog(@"two parameters!");
}

多态调用:

[self test:1];          // output:one parameter!
[self test:1 andTwo:2]; // output:two parameter!

可以看出OC可以通过参数个数实现函数重载,但是如果参数相同,无论参数和返回值类型相同与否都无法编译通过。下面的定义是无法通过xcode的编译的:

- (void)test:(int)one;
- (int)test:(float)one; // Duplicate declaration of method 'test'

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 沙盒路径获取以及图片保存到相簿的方法

    沙盒路径获取以及图片保存到相簿的方法

    下面小编就为大家分享一篇沙盒路径获取以及图片保存到相簿的方法,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • iOS通过block在两个页面间传值的方法

    iOS通过block在两个页面间传值的方法

    不知道大家有没有发现,在实际开发中使用block的地方特别多,block比delegate和notification有着更简洁的优势,下面这篇文章我们来简单了解一下block在两个页面之间的传值。有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11
  • iOS中PNChart与UITableView的联动示例详解

    iOS中PNChart与UITableView的联动示例详解

    PNChart是个界面很漂亮的图表第三方库,UITableView则不用过多介绍了,各位iOS开发者们都知道,下面这篇文章主要给大家介绍了关于iOS中PNChart与UITableView的联动的相关资料,需要的朋友可以参考下
    2018-07-07
  • iOS开发状态栏及设置功能全面详解

    iOS开发状态栏及设置功能全面详解

    这篇文章主要为大家介绍了iOS开发状态栏及设置功能全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 详解iOS 验证码输入的实现思路

    详解iOS 验证码输入的实现思路

    这篇文章主要介绍了iOS 验证码输入一种实现思路,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • IOS ObjectiveC中的赋值与对象拷贝

    IOS ObjectiveC中的赋值与对象拷贝

    这篇文章主要介绍了IOS ObjectiveC中的赋值与对象拷贝的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • iOS中获取系统相册中的图片实例

    iOS中获取系统相册中的图片实例

    这篇文章主要介绍了iOS中获取系统相册中的图片实例,具有一定的参考价值没有需要的朋友可以了解一下。
    2016-11-11
  • iOS实现控制屏幕常亮不变暗的方法示例

    iOS实现控制屏幕常亮不变暗的方法示例

    最近在工作中遇到了要将iOS屏幕保持常亮的需求,所以下面这篇文章主要给大家介绍了关于利用iOS如何实现控制屏幕常亮不变暗的方法,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-10-10
  • iOS视频编辑之添加音轨的方法

    iOS视频编辑之添加音轨的方法

    本篇文章主要介绍了iOS视频编辑之添加音轨的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • IOS客户端接入微信支付

    IOS客户端接入微信支付

    对于一个ios的app,如果有一些虚拟的商品或者服务需要通过在线支付来收费的话,一般有几种主流的选择。如果是通过APP调用支付平台APP的思路的话,一个是调起支付宝客户端,一个则是调起微信支付。本文给大家分享ios客户端接入微信支付,需要的朋友可以参考下
    2015-09-09

最新评论