0

我需要我的所有视图控制器能够显示消息撰写视图控制器 ( MFMessageComposeViewController) 并处理MFMessageComposeViewControllerDelegate方法来查看消息是否已发送/取消/失败。所以我的想法是UIViewController在这个视图控制器中对这些方法进行子类化。然后让我所有需要能够发送消息的视图控制器子类化上述视图控制器。

所以喜欢BaseMessageViewController : UIViewController

然后ViewController1 : BaseMessageViewControllerViewController2 : BaseMessageViewController以此类推……

所以当我在做的时候,我想我会创建一个这样的协议:

@protocol MessageProcessing

@required

- (void)presentMessageCompose;
- (void)processMessageCancelled;
- (void)processMessageSent;
- (void)processMessageFailed;

@end

但我不确定是否BaseMessageViewController应该遵守这个协议,或者我的“具体”视图控制器是否应该遵守它?

一种想法是,如果我BaseMessageViewController符合它,那么我的具体视图控制器会因为类继承而自动符合它?但是我在具体的视图控制器中没有看到任何警告,表明它们没有实现所需的方法。

有人可以在这里帮我一把吗:)

4

2 回答 2

1

如果这些是BaseMessageViewController发送给自己的消息,则没有理由定义协议。只需在 中声明方法BaseMessageViewController,并注释声明以描述它们何时发送。

您还需要提供方法的实现BaseMessageViewController以抑制编译器警告。如果您希望每个子类都实现方法,则可以BaseMessageViewController使用此模式定义方法:

- (void)processMessageCancelled {
    [self doesNotRecognizeSelector:_cmd];
    abort();
}
于 2012-05-21T20:54:46.010 回答
0

这是抽象基类协议问题的经典示例。

  • 当您想定义一个框架时,使用抽象基类(在 Cocoa 中这些称为类集群),框架封装了一些常见的关注点,而子类处理了一些特定的关注点。一个例子可以是消息解析框架。

  • 使用协议为需要自己的对象层次结构的类定义通用协定。一个示例可能是媒体播放器,其中“播放”和“停止”完全不同,具体取决于媒体类型。

或者,对于介于两者之间的东西,Justin Spahr-summers 在 libextobjc 中定义了“具体协议”。. . https://github.com/jspahrsummers/libextobjc(类似于 Java 8 中的具体接口)。

于 2013-08-02T03:41:07.203 回答