调用继承的私有方法的美丽解决方案

fla*_*nka 2 architecture objective-c

基本上我想要解决以下问题的最佳解决方案:

    //  A.h
    @interface A : NSObject

    @end

    //  A.m
#import "A.h"

@implementation A

- (id)init
{
    self = [super init];
    if (self) {
        [self childWillOverride];
    }
    return self;
}

- (void)childWillOverride {
    NSLog(@"childWillOverride - A");
}
@end
//  B.h
#import <UIKit/UIKit.h>
#import "A.h"

@interface B : A

@end

//  B.m
#import "B.h"

@implementation B

- (id)init
{
    self = [super init];
    if (self) {
        [self childWillOverride];
    }
    return self;
}

- (void)childWillOverride {
    [super childWillOverride]; // This is not possible
    NSLog(@"childWillOverride - B");
}

@end
Run Code Online (Sandbox Code Playgroud)

我不想将函数名称移动到Ah,或者我不想为函数名创建新的Category或.h文件.你有其他想法吗?

Rob*_*Rob 13

就个人而言,我宁愿为那些受保护的方法创建一个单独的.h文件,就像Apple所做的那样<UIKit/UIGestureRecognizerSubclass.h>.

另一种方法(我不喜欢)是使用私有类扩展:

因此,你的Bm将是:

#import "B.h"

@interface A ()
- (void) childWillOverride;
@end

@implementation B

- (id)init
{
    self = [super init];
    if (self) {
        [self childWillOverride];
    }
    return self;
}

- (void)childWillOverride {
    [super childWillOverride]; // This is now possible
    NSLog(@"childWillOverride - B");
}

@end
Run Code Online (Sandbox Code Playgroud)

我不喜欢这种方式使用类扩展(在B的.m文件中定义A的私有实现很奇怪),所以我个人使用单独的.h方法.

  • @flatronka - 你试图做一些你不应该做的事情,覆盖一个*private*方法,这样你就会以某种方式弄脏你的手.Rob展示的解决方案有一个非常干净的好处,你为什么不喜欢它?另一种解决方案是调用运行时方法来定位方法的实际实现并直接调用它 - 更加混乱. (2认同)