SubClasing用法--子類重寫父類方法,父類直接呼叫實現方式
subclasing 淺談 -- 父類和子類之間進行訊息傳遞的一種實現
繼承:一個派生類可以從一個基類派生,這個派生類就是子類,當子類繼承父類之後,可以重寫父類的方法或者直接呼叫父類的方法,即子類擁有父類的所有功能並且可以進行功能的擴充套件,我們通過繼承可以實現低耦合和程式介面的統一,讓程式複用性更高
多型:多型性可以簡單地概括為“一個介面,多種方法”,程式在執行時才決定呼叫的函式,它是面向物件程式設計領域的核心概念。多型(polymorphism),字面意思多種形狀。
考慮:C++中有多繼承和虛擬函式,可以實現父類呼叫子類的方法---通過子類建立例項,父類定義介面,讓子類的例項強轉父類呼叫介面即可實現父類呼叫子類的方法,OC中沒有虛擬函式,那如何實現這種方式呢?
探究:OC中有沒有實現這種方式的寫法呢? 答案是肯定的,OC中實現多型是通過採用(subclassing)這種方式實現的
實現:【先考慮基類是單利時候】
第一步:先定義基類即super class,在定義介面的時候,需要指出哪些是子類可以重寫並可以有父類呼叫的,父類.h 實現介面如下:
#import <Foundation/Foundation.h> /************************super class interface***********************/ @interface SuperClass : NSObject + (id)sharedReporter; - (void)showSubData; - (void)subComeBack; @end /************************sub class interface***********************/ @interface SuperClass (subclasing) - (id)initShareSubclass; - (void)sendSuperData:(NSString *)str; @end
注:此時在.m 中可以任意呼叫和實現subclsing所定義的介面方法,當沒有子類繼承的時候,就呼叫這些方法,如果有子類呼叫並重寫了這些方法,此時會呼叫子類的,父類的方法將被覆蓋
第二步:實現方法,先實現share的方法,重點是在share建立中去呼叫subclasing中定義的init類實現當創例項物件
@interface SuperClass() @property (nonatomic,assign) int classtag; @end @implementation SuperClass + (id)sharedReporter { static dispatch_once_t __sharedToken = 0; static SuperClass * sharedSuper = nil; dispatch_once(&__sharedToken, ^{ sharedSuper = [[self alloc] initShareSubclass]; }); return sharedSuper; } - (void)showSubData { NSString *str = @"superData"; [self sendSuperData:str]; //呼叫子類方法,如果有子類,就會呼叫子類的方法,因為介面部分已經跟定了這個是子類實現的, NSLog(@""); } - (void)subComeBack { NSLog(@"子類回撥方法"); } //子類的 init,在建立父類的時候做子類的建立,實現父類 呼叫子類的方法 - (id)initShareSubclass { if (self = [super init]) { } return self; } - (void)sendSuperData:(NSString *)str { NSLog(@"子類執行這個方法~"); [self subComeBack]; } @end
注:如果沒有子類的重寫
@interface SuperClass (subclasing)
- (id)initShareSubclass;
- (void)sendSuperData:(NSString *)str;
@end
這兩個方法,那父類例項物件呼叫的就是本類中實現的方法。
第三步:繼承基類,重寫基類Subclasing中的方法,當然子類繼承父類,可以直接super 父類中的.h 上定義的所有方法
#import "SuperClass.h"
@interface SubClass :SuperClass
@end
#import "SubClass.h"
@implementation SubClass
//重寫父類方法
- (void)sendSuperData:(NSString *)str
{
NSLog(@"str SUB = %@",str);
//呼叫父類方法
[super subComeBack];
}
@end
注:此時,SuperClass *sub = [SuperClass sharedReporter]; [sub showSubData]; 呼叫的時候,父類就實現了呼叫子類的方法,實現子類重寫父類方法,讓父類去呼叫
用途:當你封裝了一個類,這個類是高度定義的基類,但是基類需要實現多種型別的功能【多型】,就需要這種方式來實現多型。
擴充套件:上例按照單利寫的,便於理解,如果不是單利,在實現的時候,就需要例項化子類,然後強轉成父類,利用父類的指標來去呼叫幾口,實現對子類方法的抵用。
總結:這個是實現封裝和多型的一種方式,是一種高內聚,低耦合的一種實現方式,如果要加深這種寫法,不防看看C++中的虛擬函式吧~