我需要所有视图控制器能够显示Message compose视图控制器(MFMessageComposeViewController
)并处理MFMessageComposeViewControllerDelegate
方法以查看消息是否已发送/取消/失败。所以我的想法是在这个视图控制器中继承UIViewController
这些方法。然后让我的所有视图控制器都需要能够发送消息子类上面的视图控制器。
就像BaseMessageViewController : UIViewController
然后ViewController1 : BaseMessageViewController
,ViewController2 : BaseMessageViewController
等等......
所以当我参与其中时,我想我会创建一个这样的协议:
@protocol MessageProcessing
@required
- (void)presentMessageCompose;
- (void)processMessageCancelled;
- (void)processMessageSent;
- (void)processMessageFailed;
@end
但是我不确定BaseMessageViewController
是否应符合此协议,或者我的“具体”视图控制器是否应该符合它?
有一种想法是,如果我的BaseMessageViewController
符合它,那么由于类继承,我的具体视图控制器会自动符合它吗?但是我在具体的视图控制器中没有看到任何警告他们没有实现所需的方法。
有人可以在这里帮助我:)
答案 0 :(得分:1)
如果这些是BaseMessageViewController
发送给自己的消息,则没有理由定义协议。只需声明BaseMessageViewController
中的方法,并注释声明以描述它们何时被发送。
您还需要在BaseMessageViewController
中提供方法的实现以抑制编译器警告。如果您希望每个子类都实现这些方法,您可以使用以下模式在BaseMessageViewController
中定义方法:
- (void)processMessageCancelled {
[self doesNotRecognizeSelector:_cmd];
abort();
}
答案 1 :(得分:0)
这是抽象基类与协议问题的典型示例。
当您要定义框架时,使用抽象基类(在Cocoa中称为类集群),框架封装了一些常见问题以及一些特定问题由子类处理。一个例子可以是消息解析框架。
使用协议为需要自己的对象层次结构的类定义公共协定。一个例子可能是媒体播放器,其中“播放”和“停止”完全不同,具体取决于媒体类型。
或者,对于介于两者之间的东西,Justin Spahr-summers定义了libextobjc中的“具体协议”。 。 。 https://github.com/jspahrsummers/libextobjc(类似于Java 8中的具体接口)。