B的子类(继承自A类)是否可以继承A的子类而不是A本身?

时间:2013-03-01 04:47:52

标签: ios oop

我正在开发iOS应用程序的辅助功能项目。由于辅助功能的行为与宣传不同,因此我必须覆盖子类中的accessibilityFrameaccessibilityActivationPointpointInside:withEvent,以便扩展VoiceOver识别的区域(用于绘图和触摸识别)超出控制视图的“自然”范围。因此,为了更改UIButton的VoiceOver边界,我必须继承该类,然后添加这三个方法。为了对UILabel执行此操作,我必须使用代码添加另一个子类,依此类推。

我可以将这些方法中的代码重构到一个中心位置,但我想知道这是否可以通过继承更优雅地完成。我想将此代码放入UIView的子类(可能称为UIViewAccessible),然后创建一个名为UIButton的{​​{1}}子类,它继承自UIButtonAccessible而这将继承自UIButton而不是UIViewAccessible。这是可能的,还是可以用类别完成这样的事情?

修改:根据文档,您无法通过以下类别实现此目标:

  

如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(或甚至是超类)中的另一个类别中的方法相同,则行为未定义为哪个方法实现在运行时使用。

还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

要回答你的问题,不,它不能,因为你的UIViewAccessible是继承链中UIButton的第二级兄弟(在某些时候都从UIView继承) 。但我想你已经知道了。至于解决方案,您可以将UIView可访问类包装为装饰器,并使用协议进行强类型处理。这样你就可以将代码保存在一个地方。我已经更详细地描述了这种技术here(尽管出于不同的目的,情况也是如此)。

对于支持辅助功能的视图,您必须执行此操作:

@property (nonatomic, strong) UIView<MyAccesibilityProtocol>* view;

//self.view can come from the nib or previously created in code
self.view = [[AccesibilityDecorator alloc] initWithDecoratedObject:self.view];

//you can then use self.view like any other UIView, 
//and because it also implements an 
//accessibility protocol, you can use the methods 
//implemented in the wrapper as well.
//more than that, you can control which methods to override
//in the AccesibilityDecorator class
[self.view addSubview:otherView];//could be overridden or not
[self.view myAccesibilityMethod];//custom method declared in the protocol