在Objective-C中,在委托/协议方法的实现中用更具体的(子类)参数类型替换参数类型是否被认为是好的还是坏的做法?
例如,根据UIGestureRecognizer的文档:
The action methods invoked must conform to one of the following signatures: - (void)handleGesture; - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;
当我向视图添加UITapGestureRecognizer时,我知道handleGesture:
的参数将是UITapGestureRecognizer类型(除非稍后添加另一个手势识别器)。是否不赞成用UITapGestureRecognizer类型的参数替换UIGestureRecognizer参数?例如:
- (void)handleGesture:(UITapGestureRecognizer *)gestureRecognizer { // implementation }
答案 0 :(得分:2)
协议不允许您这样做,因为参数类型是协议规范的一部分。但是你可以而且经常应该用行动方法来做到这一点。我见过动作方法的代码如下:
- (void)somethingOrOtherAction:(id)sender
{
UIButton *button = (UIButton *)sender;
/* do something with |button| */
}
此代码仅在发件人是按钮时才有效,因此参数的类型没有理由不是UIButton *
。就生成的代码而言,它们都是对象的指针,因此一个与另一个一样好。但是消除演员表可以使代码更清晰,同时也可以揭示你的意图。
在你的情况下反对这一点的一件事是,如果你实际上没有使用UITapGestureRecognizer
提供的任何超过UIGestureRecognizer
的东西,那么指定更具体的类型将过度指定参数相对于代码实际预期的类型。如果代码实际上使用更通用的类型,那么您应该考虑使用更通用的类型。