gpt4 book ai didi

objective-c - Objective C 协议(protocol)等同于 Java 接口(interface)?

转载 作者:太空狗 更新时间:2023-10-30 03:58:06 24 4
gpt4 key购买 nike

问题不仅与标题有关,而且更多的是“我将如何实现这一点,而不是试图将 Java/Flash 设计强加到 Objective C (iPhone) 程序中”。

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

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

现在我将如何在 View 上调用 [UIView4instance update] 方法?或 [UIView5instance changeState] 等等。自从我将它添加到类型为 UIView 的 self.currentView 后,它不再有任何理由相信它具有 updatechangeState: 方法,这意味着我无法迭代 View 并向它们发送这些消息。

这种方法带来了很多其他问题,每次我需要对它们进行任何操作时,我都需要测试和类型转换我的 View 。

如果我在 Java 中做类似这种复合模式方法的事情。我要么编写一个所有 View (UIView1、UIview2 .... UIViewN)都将实现的界面。或者可能是一个抽象类,所有 View 都从中继承了 changeState:update 方法。

这样我就可以让 self.currentView 只知道我正在向您的 View 中添加对象,并且它们都符合这些方法。

我能想到的两个解决方案,以我很少的 Objective-C 经验是:用委托(delegate)或类别来做,但这在各个方面似乎都太过分了:/我想我也可以扩展 UIView 然后扩展我的类再次扩展 UIView,但是 Objective-C 不直接支持抽象类可能是有原因的......

希望有人能为我指出有关这些问题的正确方向。谢谢:)

最佳答案

是的,它是相等的。你可以声明一个协议(protocol)

@protocol MyViewProtocol
-(void)update;
-(void)changeState:(NSInteger)state;
@end

并像这样声明你的子类

@interface MyUIView3 : UIView<MyViewProtocol> {
....
}
....
@end

然后,声明

UIView<MyViewProtocol>* view=[[MyUIView3 alloc] init];

表示 viewUIView 的(子类)实例,它也符合 MyViewProtocol。我认为这就像它在 Java 中的工作方式一样。参见 the apple doc on protocols .

关于objective-c - Objective C 协议(protocol)等同于 Java 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2001456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com