问题不仅在于标题,更在于“我将如何实现这一点,而不试图将java/flash设计强加于一个目标c(iphone)程序中”。
我有6个视图扩展了uiview,这些视图都有不同的行为,但是都有一些共同的方法,比如-(void) update
和-(void) changeState:(NSInteger)state
。
一个VIEW控制器,它的工作是更新、实例化和显示这些视图,其中有一个开关块来实现这一点。因此,开关(4){…}实例化uiVIEW4,但由于我需要对当前实例化视图的引用(要做update
和changeState:
),所以在我的VIEW控制器上有一个UIVIEW属性,称为Self.CurrnVIEW。由于实例化的uiview4扩展了uiview,我可以轻松地转到[self.currentView addSubview:UIView4instance]
,然后释放uiview4instance。
现在我如何调用视图上的[UIView4instance update]
方法?或[UIView5instance changeState]
等。
因为我将它添加到了uiview类型的self.currentView
中,所以它不再有任何理由相信它有一个update
或changeState:
方法,这意味着我无法迭代视图并向它们发送这些消息。
这种方法带来了大量的其他问题,每当我需要对它们进行任何操作时,我就需要测试和打印我的视图。
如果我在java中做类似这种复合模式的事情。我要么编写一个所有视图(uiview1,uiview2…)的接口。uiviewn)将实现。或者可能是一个抽象类,所有视图都继承了changeState:
和update
方法。
这样我就可以知道我正在向您的视图中添加对象,它们都符合这些方法。
我能想到的两个解决方案,以我非常小的objective-c经验是:
用委托或类别来做,但这似乎在各个方面都是过分的:
我想我也可以扩展uiview,然后再次扩展我的类扩展uiview,但可能有一个原因objective-c不直接支持抽象类…
希望有人能在这些问题上给我指出正确的方向。
谢谢:)
最佳答案
是的,它是平等的。你可以声明一个协议
@protocol MyViewProtocol
-(void)update;
-(void)changeState:(NSInteger)state;
@end
声明你的子类
@interface MyUIView3 : UIView<MyViewProtocol> {
....
}
....
@end
那么,声明
UIView<MyViewProtocol>* view=[[MyUIView3 alloc] init];
意味着
view
是UIView
的一个子类的实例,它也符合MyViewProtocol
。我想这就是Java的工作方式。见the apple doc on protocols。