国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

Objective-C中的重載和重寫詳解

2020-07-26 03:05:15
字體:
來源:轉載
供稿:網友

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'

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永丰县| 邮箱| 林州市| 深泽县| 武强县| 南阳市| 古丈县| 孙吴县| 陆良县| 吴川市| 井冈山市| 新泰市| 灵石县| 西丰县| 棋牌| 鄢陵县| 淳安县| 禄丰县| 三亚市| 迁安市| 从江县| 体育| 娱乐| 陵水| 溧阳市| 新邵县| 永城市| 大荔县| 吴川市| 新平| 马公市| 武胜县| 乾安县| 双流县| 黑水县| 财经| 桃江县| 临泉县| 张家港市| 曲周县| 桓台县|