2

基本的に、次の問題に対する最良の解決策が必要です。

    //  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

関数名を Ah に移動したくない、または関数名の新しいカテゴリまたは .h ファイルを作成したくない。他のアイデアはありますか?

4

3 に答える 3

13

個人的には、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

このようにクラス拡張を使用するのは好きではないので (B の .m ファイルで A のプライベート実装を定義するのは奇妙です)、個人的には別の .h アプローチを使用します。

于 2013-06-29T11:46:58.670 に答える
3

私はこの種のもののために保護されたカテゴリを使用します:

// A.h
@interface A : NSObject
@end

// A.m
#import "A.h"
@implementation A
- (void)subclassWillOverrideButNobodyElseWill
{
  NSLog(@"Heyyyyyy");
}
@end

// A+Protected.h
#import "A.h"
@interface A (Protected)
- (void)subclassWillOverrideButNobodyElseWill;
@end

// B.h
@interface B : A
@end

// B.m
#import "A+Protected.h"
@implmentation B
- (void)subclassWillOverrideButNobodyElseWill
{
  [super subclassWillOverrideButNobodyElseWill]
  NSLog(@"Worrrrrrld");
}
@end

// Something.m
B *b = [B new];
[b subclassWillOverrideButNobodyElseWill];

// Console results:
Heyyyyyy
Worrrrrrld
于 2014-05-14T21:27:38.893 に答える
-2

次のコードを使用できます

if ([super respondsToSelector:@selector(childWillOverride)]) {
    [super performSelector:@selector(childWillOverride)];
}
于 2013-06-29T11:26:56.957 に答える