1. 程式人生 > >SubClasing用法--子類重寫父類方法,父類直接呼叫實現方式

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++中的虛擬函式吧~