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 实现中表明我“忘记”了实现 fooBar。我想我可以用存根方法来处理它(这是最好的方法吗?)。

MySpecificTableViewClass.h

....
#import "MyTableViewClass.h"

@interface MySpecificTableViewClass : MyTableViewClass
....

在 MySpecificTableViewClass 的实现中 - 没有警告表明我错过了

-(void) fooBar

如果我将 MySpecificTableViewClass.h 更改为

....
#import "MyTableViewClass.h"

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

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

4

2 回答 2

2

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

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

于 2013-02-28T17:33:45.323 回答
0

由于 MyTableViewClass 已经在实现该协议,它的子类将获得对它们可用的那些实现,这意味着子类也可以实现它们。您可以更改/扩展子类中的实现。

于 2013-02-28T17:20:58.213 回答