对于子类,我是否可以从超类实现中删除/停止方法?
(即.nsstring有一个方法长度。我想阻止“mystring”类获得长度方法)。
答案 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上。