2012-05-21 50 views
0

我需要我所有的視圖控制器能夠顯示消息撰寫視圖控制器(MFMessageComposeViewController),並處理MFMessageComposeViewControllerDelegate方法來查看郵件是否發送/取消/失敗。所以我的想法是在這個視圖控制器中繼承這些方法的子類UIViewController。然後讓我所有的視圖控制器需要能夠發送消息子類上述視圖控制器。iOS - 子類避免代碼重複和協議

所以像BaseMessageViewController : UIViewController

然後ViewController1 : BaseMessageViewControllerViewController2 : BaseMessageViewController等等...

所以,當我在這,我想我會創建這樣一個協議:

@protocol MessageProcessing 

@required 

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

@end 

但我不確定BaseMessageViewController應該符合此協議還是我的「具體」視圖控制器應符合它?

一個想法是,如果我的BaseMessageViewController符合它,那麼我的具體視圖控制器會自動符合它,因爲類繼承?但是在具體的視圖控制器中我沒有看到任何警告,他們沒有實現所需的方法。

可有人請給我在這裏伸出援助之手:)

回答

1

如果這些消息是BaseMessageViewController發送給自己,沒有理由來定義一個協議。只需在BaseMessageViewController中聲明方法,並對聲明進行註釋以描述它們何時發送。

您還需要提供BaseMessageViewController中方法的實現來抑制編譯器警告。如果你想每個子類中實現的方法,您可以使用這一模式在BaseMessageViewController定義方法:

- (void)processMessageCancelled { 
    [self doesNotRecognizeSelector:_cmd]; 
    abort(); 
} 
+0

我正在尋找一種方法來重寫像你可以用Java做的方法......你在你的超類中聲明瞭一些方法,然後在你的子類中你可以擁有你自己的方法實現(如果你喜歡的話)在超類中聲明或者只是讓它使用超類方法。 –

+0

也可以將KVO添加到'BaseMessageViewController',這樣我的所有視圖控制器都將具有KVO,以便在'BaseMessageViewController'中設置屬性。 –

0

這是抽象基類 VS 協議問題的一個典型的例子。

  • 使用一個抽象基類(可可這些被稱爲類集羣)當您希望定義一個框架,該框架封裝的一些常見問題和一些具體問題由子處理 - 班。一個例子可以是消息解析框架。

  • 使用協議爲需要它們自己的對象層次結構的類定義公共契約。一個例子可能是媒體播放器,其中「播放」和「停止」根據媒體類型完全不同。

或者,對於中間的東西,Justin Spahr-Summers在libextobjc中定義了「具體協議」。 。 。 https://github.com/jspahrsummers/libextobjc(類似於Java 8中的具體接口)。