解决重写父类的方法且不会影响继承的子类的问题
解決重寫父類的方法且不會(huì)影響繼承的子類的問題
基類的方法被所有繼承的子類繼承,是不應(yīng)該被修改的,如果繼承的子類重寫了基類的方法,那么,再從這個(gè)子類派生出子類的話,這個(gè)派生的子類接口已經(jīng)破壞掉了統(tǒng)一的接口.
但有時(shí)候,我們需要一個(gè)子類能擴(kuò)展基類的方法,但又不想破壞這個(gè)統(tǒng)一的接口,這時(shí)候,哥就來教你既能擴(kuò)展功能,又能保證接口的統(tǒng)一性:)
首先做幾個(gè)實(shí)驗(yàn)驗(yàn)證:
提供的源碼如下:
A類? B類? C類? (B類繼承于A類,C類繼承于B類)
// // A.h // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <Foundation/Foundation.h>@interface A : NSObject- (void)info;@end // // A.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "A.h"@implementation A- (void)info {NSLog(@"%@ message:%@", self, @"A"); }@end // // B.h // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "A.h"@interface B : A- (void)info;@end // // B.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "B.h"@implementation B- (void)info {[super info];NSLog(@"%@ message:%@", self, @"B"); }@end // // C.h // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "B.h"@interface C : B- (void)info;@end // // C.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "C.h"@implementation C- (void)info {[super info];NSLog(@"%@ message:%@", self, @"C"); }@end測試的源碼如下:
// // RootViewController.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" #import "A.h" #import "B.h" #import "C.h"@interface RootViewController ()@end@implementation RootViewController- (void)viewDidLoad {[super viewDidLoad];A *a = [A new];B *b = [B new];C *c = [C new];[a info];NSLog(@"\n===========\n");[b info];NSLog(@"\n===========\n");[c info]; }@end打印結(jié)果:
2014-08-16 09:48:13.556 Super[23845:60b] <A: 0xa142620> message:A
2014-08-16 09:48:13.557 Super[23845:60b]
===========
2014-08-16 09:48:13.557 Super[23845:60b] <B: 0xa142f00> message:A
2014-08-16 09:48:13.557 Super[23845:60b] <B: 0xa142f00> message:B
2014-08-16 09:48:13.558 Super[23845:60b]
===========
2014-08-16 09:48:13.558 Super[23845:60b] <C: 0xa142fd0> message:A
2014-08-16 09:48:13.558 Super[23845:60b] <C: 0xa142fd0> message:B
2014-08-16 09:48:13.559 Super[23845:60b] <C: 0xa142fd0> message:C
為什么C對象會(huì)執(zhí)行了3次呢?請看下圖:
因?yàn)?重寫了父類的方法時(shí)是需要先調(diào)用父類方法的,畢竟,有時(shí)候,父類的方法進(jìn)行了一些配置,子類才能用,所有,通過 super 調(diào)用了父類的方法,一級(jí)一級(jí)到達(dá)了基類A了.
我們要達(dá)到什么樣的效果呢?
我們需要達(dá)到的效果是:讓子類C不會(huì)調(diào)用A類與B類的打印語句
修改成如下形式:
打印結(jié)果:
2014-08-16 10:07:57.270 Super[23966:60b] <A: 0x8d17200> message:A
2014-08-16 10:07:57.272 Super[23966:60b]
===========
2014-08-16 10:07:57.272 Super[23966:60b] <B: 0x8d17aa0> message:B
2014-08-16 10:07:57.272 Super[23966:60b]
===========
2014-08-16 10:07:57.273 Super[23966:60b] <C: 0x8d17b70> message:C
?
為什么要這么做呢?
其實(shí),這就是軟件設(shè)計(jì)中的不破壞原始接口的用處哦:),需要自己去慢慢體會(huì).
總結(jié)
以上是生活随笔為你收集整理的解决重写父类的方法且不会影响继承的子类的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET开发的一些积累
- 下一篇: Thread.sleep() Syst