如何继承类簇(例如NSString)

在今天之前 如果有人问我 如果给NSString添加一个方法 ,我最先想到的方法肯定就是使用Category。一直觉得NSString是不能被继承的,因为它是类簇,其实如果真的想继承,也是有办法的。
在Cocoa框架里有许多类簇,比如NSArray,NSString,NSNumber(具体什么是类簇就不解释了。网上关于类簇的介绍很多)。在这里我就把今天看到的《Effective Objective-C 2.0》中关于如何如果继承类簇介绍一下。

具体关于如何为类簇添加子类,需要遵守几条规则:

  1. 子类应该继承自类簇中的抽象基类。
  2. 子类应该自定义自己的数据存储方式。(开发者编写NSArray子类时,必须用一个实例变量来存放数组中的对象。这似乎与大家预想的不同,我们以为NSArray自己肯定会保存那些对象,所以在子类中就无须再保存一份了。但是大家要记住,NSArray本身只不过是包在其他隐藏对象外面的壳,它仅仅定义了所有数组都需具备的一些接口。对于这个自定义的数组类来说,可以用NSArray来保存其实例)。
  3. 子类应当覆写超类文档中指明需要覆写的方法。

接下来就动手实现如何继承NSArray 和 NSString。

#import "WUArray.h"

@interface WUArray()

{
    NSArray *_storeArray;
}

@end

@implementation WUArray

- (instancetype)initWithArray:(NSArray *)array {
    if (self = [super init]) {
        _storeArray = [NSArray arrayWithArray:array];
    }
    return self;
}


#pragma mark - override
- (NSUInteger)count {
    return _storeArray.count;
}
- (id)objectAtIndex:(NSUInteger)index {
    return [_storeArray objectAtIndex:index];
}



@end
以上为WUArray.m文件
#import "WUString.h"

@interface WUString()
{
    NSString *_storeString;
}

@end

@implementation WUString

- (instancetype)initWithString:(NSString *)aString {
    if (self = [self init]) {
        _storeString = [[NSString stringWithString:aString] copy];
    }
    return self;
}

- (NSUInteger)length {
    return [_storeString length];
}

- (unichar)characterAtIndex:(NSUInteger)index {
    return [_storeString characterAtIndex:index];
}

@end
以上为WUString.m 文件

实现完之后 来验证一下:

WUString *str = [[WUString alloc] initWithString:@"123456789"];
    NSLog(@"%@",[str substringFromIndex:5]); //控制台打印输出为 6789
    
    WUArray *array = [[WUArray alloc] initWithArray:@[@"h",@"e",@"l",@"l",@"0"]];
    NSLog(@"%@",[array componentsJoinedByString:@"."]); //控制台打印输出为 h.e.l.l.o

在继承的时候 关于要具体覆写超类的哪几个方法,NSString的头文件里面写的有:

/* NSString primitives. A minimal subclass of NSString just needs to implement these two, along with an init method appropriate for that subclass. We also recommend overriding getCharacters:range: for performance.
 */
@property (readonly) NSUInteger length;
- (unichar)characterAtIndex:(NSUInteger)index;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,219评论 30 472
  • 当生命的计时器停止摆动,当死亡悄然降临……这一刻,你留在世上的会是什么?近日,一场集体“葬礼”在成都七中万达学校的...
    小悟62阅读 660评论 0 1
  • 前几日上网看见一段公益性街拍视频,视频中的主角是一个八九岁的小女孩,节目组交给她的任务是:在大街上寻求帮助,把手中...
    凤凰磐石阅读 346评论 0 0
  • 又作了个可怕的梦 自己去讨论婚纱照事宜另一位全程不带问还带不耐烦和恼火的 我挺难过的 睡多了就做不开心的梦 可见内...
    金言儿阅读 214评论 0 0
  • 创业,是一个沉重又令人激动的话题。有人说,创业就是一个人走夜路。一个人走,一个人抗。不论路途多么艰难,都要一直走下...
    f84c6d5b0ec1阅读 397评论 0 1