2011-06-05 84 views
1

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

回答

2

协议不会让你这样做,因为参数类型是协议规范的一部分。但是,你可以并且经常应该用行动方法来做到这一点。我已经看到代码的操作方法,看起来像这样:

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

此代码仅当发送方是一个按钮的工作原理,所以没有理由参数的类型比UIButton *的任何其他。就生成的代码而言,它们都是指向对象的指针,所以一个和另一个一样好。但是消除代码会使代码更清晰,同时也会显示您的意图。

在你的情况中反对这一点的一件事是,如果你实际上没有使用UITapGestureRecognizer提供的任何东西而不是UIGestureRecognizer,那么指定更具体的类型将相对于代码实际上指定参数类型预计。如果代码实际上可以使用更一般的类型,那么你应该考虑使用更一般的类型。

相关问题