子类是否可以在继承方法的参数块中添加参数?

时间:2013-12-24 19:57:59

标签: objective-c inheritance methods objective-c-blocks override

情况

超类定义方法,子类重新定义该方法。唯一的区别是子类在块中添加一个参数,它本身就是方法的参数。

一个例子

想象一下,我有一个类Collection和一个后代类List,它们在其他方法中定义了NSArray - 样式中的枚举方法。

@interface Collection : NSObject
- (void)enumerateObjectsUsingBlock: (void (^)(id obj))block;
@end

@interface List : Collection
- (void)enumerateObjectsUsingBlock: (void (^)(id obj, int index))block;
@end

问题

这是否有效(在所有平台上)并且是否符合标准?

我认为它会起作用,因为超类方法中的参数列表不受影响,而子类方法的用户会知道(可选地使用某些类型转换)额外参数。

1 个答案:

答案 0 :(得分:7)

总之;不,不要这样做。

长:

它适用于大多数情况,但您必须努力避免编译器警告。 Objective-C不支持方法的共变量或反变量声明(这就是创建instancetype的原因)。由于块类型不同,方法参数类型也不同。

你也不能假设一个功能,方块或方法,例如(a),(a,b), (a,b.c)(a,b,c,d)等...将兼容呼叫网站。即你不能说fun(a,b,c,d) fun实际上是fun(a),并保证你能得到你所期望的。