Objective C协议与Java接口相同?

Ric*_*kiG 4 inheritance interface objective-c

问题不仅在于标题,而在于"我将如何实现这一点,而不是试图将Java/Flash设计强制转换为Objective C(iPhone)程序".

我有6个视图扩展UIView,这些视图都有不同的行为,但共享某些方法,如-(void) update-(void) changeState:(NSInteger)state.

一个viewController,它的工作是更新,实例化和显示这些视图,它有一个开关块来执行此操作.所以switch(4){...}实例化UIView4,但由于我需要对当前实例化视图的引用(要做updatechangeState:),我的ViewController上有一个名为self.currentView的UIView属性.当实例化的UIView4扩展UIView时,我可以轻松地[self.currentView addSubview:UIView4instance]然后释放UIView4instance.

现在我将如何[UIView4instance update]在视图上调用该方法?或[UIView5instance changeState]等等.由于我加入它self.currentView是类型的UIView它不再具有任何理由相信它具有的updatechangeState:方法,这意味着我不能迭代的观点,并将它们发送这些消息.

这种方法带来了大量其他问题,每次我需要对它们进行任何操作时,我都需要测试并输入我的视图.

如果我在Java中使用这种复合模式方法.我要么写一个所有视图(UIView1,UIview2 ...... UIViewN)都会实现的接口.或者也许是一个抽象类,所有视图都继承了这些视图changeState:update方法.

这样我就可以self.currentView知道我正在向视图中添加对象,并且它们都符合这些方法.

我能想到的两个解决方案,就是我非常小的Objective-C经验:用委托或类别来做这件事,但这似乎有点过分:/我想我也可以扩展UIView,然后扩展我的类,再次扩展UIView,但是可能有一个原因Objective-C不直接支持抽象类......

希望有人能指出我在这些问题上的正确方向.谢谢:)

Yuj*_*uji 8

是的,它是平等的.您可以声明协议

@protocol MyViewProtocol
-(void)update;
-(void)changeState:(NSInteger)state;
@end
Run Code Online (Sandbox Code Playgroud)

并声明您的子类

@interface MyUIView3 : UIView<MyViewProtocol> {
....
}
....
@end
Run Code Online (Sandbox Code Playgroud)

然后,宣言

UIView<MyViewProtocol>* view=[[MyUIView3 alloc] init];
Run Code Online (Sandbox Code Playgroud)

表示它view是一个(也是子类的)实例,UIView它也符合MyViewProtocol.我想,正如它在Java中的工作方式一样.请参阅协议上的apple doc.