我对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标签中搜索除“子类”以外的内容,这会产生太多结果找到我想要的东西。
答案 0 :(得分:11)
糟糕的主意。 NSArray
实际上是class cluster(这是[基本上]一个抽象工厂的词)。这意味着当您alloc
/ init
NSArray
时,您实际上并未获得NSArray
。你得到(通常)一个NSCFArray
,这是一个私有子类。
NSMutableArray
是同一笔交易(它是抽象的)。当您alloc
/ init
和NSMutableArray
时,您会得到一个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的子类,查找类别。它提供了一种向类
添加更新方法的方法