Objective-C使用更具体的参数类型委托方法

时间:2011-06-05 21:48:07

标签: objective-c

在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
}

1 个答案:

答案 0 :(得分:2)

协议不允许您这样做,因为参数类型是协议规范的一部分。但是你可以而且经常应该用行动方法来做到这一点。我见过动作方法的代码如下:

- (void)somethingOrOtherAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    /* do something with |button| */
}

此代码仅在发件人是按钮时才有效,因此参数的类型没有理由不是UIButton *。就生成的代码而言,它们都是对象的指针,因此一个与另一个一样好。但是消除演员表可以使代码更清晰,同时也可以揭示你的意图。

在你的情况下反对这一点的一件事是,如果你实际上没有使用UITapGestureRecognizer提供的任何超过UIGestureRecognizer的东西,那么指定更具体的类型将过度指定参数相对于代码实际预期的类型。如果代码实际上使用更通用的类型,那么您应该考虑使用更通用的类型。