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++中的虚函数吧~