Dav*_*man 0 inheritance objective-c
我对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"];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.但是当我运行程序时,我收到一个错误,表明它insertObject:atIndex:现在是抽象的,需要实现.阅读文档,它列出了必须在任何子类中实现的几种方法,NSMutableArray其中一种方法确实如此insertObject:atIndex:.但我不需要改变功能insertObject:atIndex:; 我想让它完全像它一样NSMutableArray.有没有办法可以做到这一点(一般来说,不仅仅是针对这个具体问题)?为什么必须在像这样的子类中实现某些方法?那种失败不是继承,代码重用的目的之一吗?我从来没有在其他语言中看到过这样的东西,其中一个方法在超类中是具体的,但在它是子类时变得抽象.这个模式/概念有名字吗?
提前感谢您的任何帮助,如果我复制了另一个问题,我很抱歉,但我不知道在objective-c标签中搜索除"子类"以外的内容,这给了太多结果以找到什么我在寻找.
Dav*_*ong 11
馊主意. NSArray实际上是一个类集群(这是我们[基本上]一个抽象工厂的词).这意味着,当你alloc/ init一NSArray,你实际上并没有得到NSArray回来.你得到(通常)NSCFArray一个私有子类.
NSMutableArray是同样的交易(这是抽象的).当你alloc/ init的NSMutableArray,你得到一个NSCFArray具有翻转一点点内部可变比特回来.
这样做的结果是通常不鼓励使用类集群的子类,因为它比创建普通子类要复杂一些.
我建议的是检查CHDataStructures框架,它有一大堆数据结构,可以满足您的需求.