我正在创建一个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>
....
然后我确实得到了警告,但记住来定义协议,似乎反直觉,或者我完全错过了什么?
答案 0 :(得分:2)
除了放入存根并在其中调用NSAssert()
以捕获(在运行时)任何未实现的方法之外,我还没有找到实现此方法的好方法。 Objective-C没有抽象类的概念。
那就是说,虽然我自己也使用过这种模式,但通常最好重新考虑一下你的设计并使用策略模式和协议。也就是说,不是使用抽象MyTableViewClass
,而是创建MyTableViewHandler
,它是NSObject
的子类,并包含您需要的任何特殊逻辑。然后,您的表视图控制器可以是UITableViewController
的直接子类和MyTableViewHandler
的委托。作为代表,可以强制执行协议。这创建了一个更简单,更灵活的对象模型。它并不总是合适的,抽象类有它们的位置,但在跳转到纯继承之前要考虑策略模式。它通常效果更好。
答案 1 :(得分:0)
由于MyTableViewClass已经在实现协议,它的子类将为它们提供这些实现,这意味着子类也可以实现它们。您可以更改/扩展子类中的实现。