Objective-C从类中删除继承的方法

时间:2010-10-12 20:39:40

标签: objective-c cocoa

对于子类,我是否可以从超类实现中删除/停止方法?

(即.nsstring有一个方法长度。我想阻止“mystring”类获得长度方法)。

6 个答案:

答案 0 :(得分:13)

length是NSString类集群中的原始方法;几乎NSString中的每个其他方法都是使用对length的调用实现的。

不要走这条疯狂的道路,而要让你的班级成为NSObject的子类。如果没有length方法,它无论如何都不是真正有效的NSString子类。

答案 1 :(得分:10)

您可以覆盖调用doesNotRecognizeSelector:的方法:

- (NSUInteger)length
{
    [self doesNotRecognizeSelector:_cmd];
}

但是如果你必须这样做,你可能想要重新考虑你是否真的想要首先进行子类化。如果您只想“继承”特定的行为/方法,那么使用组合而不是继承可能会更好。

答案 2 :(得分:3)

您覆盖respondsToSelector:以便为相应的选择器返回NO,并覆盖调用doesNotRecognizeSelector:的方法。

答案 3 :(得分:2)

更好的答案是“不要那样做”。不要尝试删除方法,而是在类的实现中放置NSAssert(NO,@“不要叫我”),不要自己调用它。

如果你必须创建一个“像X但不做Y”的事情,那就创建一个新类,并将行为委托给真实X的实例。

答案 4 :(得分:1)

你不能简单地覆盖这个方法吗?

答案 5 :(得分:1)

您可以使用doesNotRecognizeSelector:。来自文档:

- (id)copy
{
    [self doesNotRecognizeSelector:_cmd];
}

然而,很有可能这是错误的事情。一个类的接口是一个契约;它声明一个实例是一个类(包括子类实例)将接受该消息。当您的MyString作为NSString传递并且它不接受length消息时,它违反了合同并且可能导致程序崩溃,因为没有人会想到通过调用{{1}来处理NSInvalidArgumentException在NSString上。