【发布时间】:2010-01-04 19:02:47
【问题描述】:
这个问题不仅与标题有关,而且更多的是“我将如何实现这一目标,而不试图将 Java/Flash 设计强制转换为 Objective C (iPhone) 程序”。
我有 6 个扩展 UIView 的视图,这些视图都有不同的行为但共享某些方法,例如 -(void) update 和 -(void) changeState:(NSInteger)state。
一个视图控制器,它的工作是更新、实例化和显示这些视图,它有一个开关块来执行此操作。所以 switch(4) {...} 实例化 UIView4,但由于我需要对当前实例化视图的引用(要执行 update 和 changeState:),所以我的 ViewController 上有一个 UIView 属性,称为 self.currentView。由于实例化的 UIView4 扩展了 UIView,我可以轻松转到[self.currentView addSubview:UIView4instance],然后释放 UIView4 实例。
现在我将如何在视图上调用[UIView4instance update] 方法?或[UIView5instance changeState] 等等等等。
由于我将它添加到 UIView 类型的 self.currentView,它不再有任何理由相信它具有 update 或 changeState: 方法,这意味着我无法迭代视图并向它们发送这些消息。
这种方法会带来很多其他问题,每次我需要对视图进行任何操作时,我都需要对其进行测试和类型转换。
如果我在 Java 中使用这种复合模式方法。我要么编写一个所有视图(UIView1,UIview2 .... UIViewN)都将实现的接口。或者可能是一个抽象类,所有视图都继承了 changeState: 和 update 方法。
这样我就可以让self.currentView 知道我正在将对象添加到您的视图中,并且它们都符合这些方法。
根据我的 Objective-C 经验,我能想到的两个解决方案是: 用委托或类别来做,但这似乎在各个方面都过分了:/ 我想我也可以扩展 UIView,然后再次扩展我的类扩展 UIView,但可能是 Objective-C 不直接支持抽象类的原因......
希望有人能在这些问题上为我指明正确的方向。 谢谢:)
【问题讨论】:
标签: objective-c inheritance interface