【问题标题】:How to extend a class method which is based on private methods如何扩展基于私有方法的类方法
【发布时间】:2011-12-06 01:21:06
【问题描述】:

假设我有一个具有以下结构的类,我希望覆盖它的委托方法之一(或者更多,通常是它的公共方法之一),但现在它基于一些私有方法。有没有办法扩展它,或者我应该简单地得出结论,它的设计没有考虑到可扩展性?

MyBaseClass.h:

@interface MyBaseClass : UIView <UITableViewDataSource, UITableViewDelegate> 
{

}

// some public methods

@end

MyBaseClass.m:

@interface MyBaseClass (Private)
- (void)_privateMethod1;
- (void)_privateMethod2;
@end

#pragma mark - UITableViewDataSource

// ------ I'D LIKE TO CHANGE THE BEHAVIOR OF THIS METHOD EXTENDING MyBaseClass
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)rowIndexPath {
    [self _privateMethod1];
    [self _privateMethod2];
}

@end

如果我真的要继续扩展类,我还需要引用私有方法,但显然我不想访问任何私有方法。 如果这个问题听起来有点琐碎,我很抱歉。

谢谢

【问题讨论】:

    标签: objective-c cocoa delegates private-members


    【解决方案1】:

    您可以在单独的头文件 MyBaseClassPrivate.h 中而不是在实现文件中声明您的私有方法,然后将其导入子类中。

    【讨论】:

      【解决方案2】:

      你不能创建一个协议来声明子类应该实现的方法吗?基类将采用该协议;子类负责各自的实现。基类实现可以提供一些通用功能或者只是return;

      @protocol MyBaseClassPrivateProtocol
      - (void)_privateMethod1;
      - (void)_privateMethod2;
      @end
      
      @interface MyBaseClass : UIViewController <MyBaseClassPrivateProtocol> 
      
      @end
      

      【讨论】:

      • 这会出现问题,例如,您正在构建一个框架并且不希望使用它的人知道 MyBaseClassPrivateProtocol