2013-02-28 36 views
2

我正在創建一個UITableViewController子類(稱之爲「MyTableViewClass」,它最終將被分類爲特定的表視圖控制器(稱爲「MySpecificTableViewClass」)。理想情況下,我想要一些方法,這些方法在MySpecificTableViewClass被「要求」,即,已經開發接口說:「實現未完成」。有沒有辦法做到這一點,而不必在協議中宣佈在MyTableViewClass?瞭解協議和子分類

MyTableViewClass.h

#import <UIKit/UIKit.h> 

@class MyTableViewClass; 
@protocol MyTableViewClassProtocol <NSObject>; 

-(void) fooBar; 
@end 

@interface MyTableViewClass : UITableViewController <NSFetchedResultsControllerDelegate, MyTableViewClassProtocol> 
.... 

這將表明在我的MyTableViewClass實現中,我ha已經「忘記」實施fooBar。我想我可以用存根方法來處理它(這是最好的方法嗎?)。

MySpecificTableViewClass.h

.... 
#import "MyTableViewClass.h" 

@interface MySpecificTableViewClass : MyTableViewClass 
.... 

在MySpecificTableViewClass執行 - 沒有警告顯示,我很想念

-(void) fooBar 

如果我改變MySpecificTableViewClass.h到

.... 
#import "MyTableViewClass.h" 

@interface MySpecificTableViewClass : MyTableViewClass <MyTableViewClassProtocol> 
.... 

然後我確實得到警告,但記住來定義協議,似乎反直覺,還是我完全錯過了什麼?

回答

2

我還沒有找到一個很好的方法來實現這個,而不是放在存根中,並調用NSAssert()來捕捉(在運行時)任何未實現的方法。 Objective-C沒有抽象類的概念。

這就是說,雖然我用這個模式我自己,往往是最好重新考慮你的設計和使用的策略模式和協議。也就是說,而不是一個抽象的MyTableViewClass,創建一個MyTableViewHandler那就是NSObject一個子類,包含了你所需要的任何特殊的邏輯。那麼你的表格視圖控制器可以是UITableViewController的直接子類和MyTableViewHandler的代表。作爲代表,該協議可以執行。這創建了一個更簡單,更靈活的對象模型。這並不總是合適的,抽象類有它們的位置,但在跳轉到純繼承之前請考慮策略模式。它通常效果更好。

+0

我現在明白了。現在我剛剛完成了你在第1段中所描述的內容(除了我使用了NSException)以外,沒有辦法讓開發者環境在運行前看到它。你的第2段的解決方案似乎更優雅,但現在,因爲我已經完成了大部分代碼的子類化UITableViewController,這將做。 – 2013-02-28 23:16:47

0

由於MyTableViewClass已經在實施該協議,它的子類將得到爲他們提供這些實現,這意味着子類也是一種實現它們。您可以更改/擴展您的子類中的實現。