objective-c - 子类可以在继承方法的参数中的 block 中添加参数吗?

标签 objective-c inheritance methods objective-c-blocks overriding

情况

父类(super class)定义方法,子类重新定义该方法。唯一的区别是子类在一个 block 中添加了一个参数,它本身就是方法的一个参数。

一个例子

假设我有一个类 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

问题

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

我想它会起作用,因为父类(super class)方法中的参数列表不受影响,而子类方法的用户会知道(可选地进行一些类型转换)额外参数。

最佳答案

简而言之;不,不要这样做。

更长:

它在大多数情况下都有效,但您必须努力避免编译器警告。 Objective-C 不支持方法的协变或逆变声明(这就是创建 instancetype 的原因)。由于 block 类型不同,方法参数类型也不同。

你也不能假设一个函数、 block 或方法采用,比方说,(a)、(a,b)、(a,b.c)(a,b,c,d) 等...将在调用站点兼容。 IE。你不能说 fun(a,b,c,d) 其中 fun 实际上是 fun(a) 并保证你会得到你所期望的。

关于objective-c - 子类可以在继承方法的参数中的 block 中添加参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20766168/

相关文章:

iphone - XCode 4.2 和 SDK 4.3 有自定义按钮字体问题吗?

objective-c - UIPicker 标签与输出不同

java - 自动调用父类(super class)方法

C# 属性在派生类中不可用

java - 如何创建动画方法并将其放入绘制方法中?我的代码不起作用

c++ - 如何将接口(interface)对象传递给方法?

c# - 在 C# 中,方法声明后的 <T> 是什么?

objective-c - 分组 TableView ——节间距

ios - 如何每天不同时间重复本地通知

c# - 通过反射从类型继承