在Objective-C中进行子类化

时间:2010-12-24 19:17:29

标签: objective-c inheritance

我对Objective-C有点新意,我一直试图做一些显然不被允许的事情,尽管这是其他语言的常见做法(我认为)。

作为一个具体的例子,我希望将NSMutableArray子类化为SortedMutableArray,使其始终保持自己处于排序状态。所以我以通常的方式将NSMutableArray子类化,添加了一个NSComparator属性来确定排序顺序。我重写addObject:方法以排序方式插入对象:

- (void) addObject:(id)anObject {
    for (int i = 0; i < [self count]; ++i) {
        NSComparisonResult result = (NSComparisonResult)self.comparator([self objectAtIndex:i], anObject); 
        if (result == NSOrderedDescending || result == NSOrderedSame) {
            [super insertObject:anObject atIndex:i];
            break;
        }
        else {
            if (result != NSOrderedAscending) {
                [NSException raise:@"InvalidBlockException" format:@"Block must return one of NSOrderedDescending, NSOrderedAscending, or NSOrderedSame"];
            }
        }
    }
}

一切都很好。但是当我运行程序时,我收到一个错误,表明insertObject:atIndex:现在是抽象的,需要实现。阅读文档,它列出了必须在NSMutableArray的任何子类中实现的几种方法,其中一种方法确实是insertObject:atIndex:。但我不需要更改insertObject:atIndex:的功能;我希望它与NSMutableArray中的完全一样。有没有办法可以做到这一点(一般来说,不仅仅是针对这个具体问题)?为什么必须在像这样的子类中实现某些方法?那种失败不是继承,代码重用的目的之一吗?我从来没有在其他语言中看到过这样的东西,其中一个方法在超类中是具体的,但在它是子类时变得抽象。这种模式/概念是否有名称?

提前感谢您的任何帮助,如果我复制了另一个问题,我很抱歉,但我不知道在objective-c标签中搜索除“子类”以外的内容,这会产生太多结果找到我想要的东西。

3 个答案:

答案 0 :(得分:11)

糟糕的主意。 NSArray实际上是class cluster(这是[基本上]一个抽象工厂的词)。这意味着当您alloc / init NSArray时,您实际上并未获得NSArray。你得到(通常)一个NSCFArray,这是一个私有子类。

NSMutableArray是同一笔交易(它是抽象的)。当您alloc / initNSMutableArray时,您会得到一个NSCFArray后退,其中有一个内部可变位翻转。

这样做的结果是,通常不鼓励使用类集群的子类,因为它比创建普通子类要复杂一些。

我建议的是检查CHDataStructures framework,它有一大堆数据结构,可以完成您正在寻找的内容。

答案 1 :(得分:2)

请参阅Dave DeLong的帖子,了解为什么这不是一个好主意。

如果你真的想做这样的事情,你可以尝试,嗯,“伪子类化”它。

<。>文件中的

...
NSMutableArray *mutableArray;
...
@property (nonatomic, retain) NSMutableArray *mutableArray;
...
- (void) addObject:(id)anObject;
<。>文件中的

...
@synthesize mutableArray;
...
- (void) addObject:(id)anObject {
    [mutableArray addObject:id];
    [mutableArray sortUsingSelector:@selector(yourSortingSelector);
}

- (NSMutableArray)mutableArray {
    return mutableArray;
}
...

哪个有效,一切都有效。我的同事之前做了类似的课程(我们当时是客观c新手,大约2-3周学习如何编码)。

但是,如果可以的话,我建议使用Key-Value Observing方法。尝试在添加元素时监听,并在收到通知时对数组进行排序。我之前没有对NSMutableArray这样做过,所以我不知道它是如何工作的,或者它是否会起作用。

我的2美分,希望它有所帮助。节日快乐! ^ _ ^

答案 2 :(得分:1)

你不应该是NSMutableArray的子​​类,查找类别。它提供了一种向类

添加更新方法的方法

apple's link to categories