了解协议和子类

时间:2013-02-28 16:58:19

标签: objective-c xcode protocols

我正在创建一个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实现中表明我已经“忘记”实现fooBar。我想我可以用stub方法处理它(这是最好的方法吗?)。

MySpecificTableViewClass.h

....
#import "MyTableViewClass.h"

@interface MySpecificTableViewClass : MyTableViewClass
....

在MySpecificTableViewClass的实现中 - 没有警告显示我缺少

-(void) fooBar

如果我将MySpecificTableViewClass.h更改为

....
#import "MyTableViewClass.h"

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

然后我确实得到了警告,但记住来定义协议,似乎反直觉,或者我完全错过了什么?

2 个答案:

答案 0 :(得分:2)

除了放入存根并在其中调用NSAssert()以捕获(在运行时)任何未实现的方法之外,我还没有找到实现此方法的好方法。 Objective-C没有抽象类的概念。

那就是说,虽然我自己也使用过这种模式,但通常最好重新考虑一下你的设计并使用策略模式和协议。也就是说,不是使用抽象MyTableViewClass,而是创建MyTableViewHandler,它是NSObject的子类,并包含您需要的任何特殊逻辑。然后,您的表视图控制器可以是UITableViewController的直接子类和MyTableViewHandler的委托。作为代表,可以强制执行协议。这创建了一个更简单,更灵活的对象模型。它并不总是合适的,抽象类有它们的位置,但在跳转到纯继承之前要考虑策略模式。它通常效果更好。

答案 1 :(得分:0)

由于MyTableViewClass已经在实现协议,它的子类将为它们提供这些实现,这意味着子类也可以实现它们。您可以更改/扩展子类中的实现。