12

私はObjective-Cでプライベートメソッドを実装する方法(Objective-Cでクラスのプライベートメソッドを定義する最良の方法)を読んでいて、質問が頭に浮かびました:

保護されたメソッド、つまりサブクラスに表示されるプライベートメソッドをどのように実装しますか?

すべてのプライベートメソッドを含むカテゴリを持つMySuperClassがあり、MySuperClassプライベートメソッドの1つに対してスーパーをオーバーライドまたは呼び出すMySubclassを実装するとします。それは可能ですか(プライベートメソッドの実装に向けたカテゴリアプローチを使用)?

このコードのいくつかを見てください。下部にオーバーライドされたメソッドがあります。

// ===========================
// = File: MySuperClass.h
// = Interface for MySuperClass
// ===========================

@interface MySuperClass : Object
...
@end

// ===========================
// = File: MySuperClass.m
// ===========================
#import "MySuperClass.h"

// =================================
// = Interface for Private methods
// =================================
@interface MySuperClass (Private)

-(void) privateInstanceMethod; 

@end

// =====================================
// = Implementation of Private methods
// =====================================
@implementation MySuperClass (Private)

-(void) privateInstanceMethod
{
  //Do something
}

@end

// ================================
// = Implementation for MySuperClass
// ================================
@implementation MySuperClass
... 
@end




// ===========================
// = File: MySubClass.h
// = Interface for MySubClass
// ===========================

@interface MySubClass : MySuperClass
...
@end


// ================================
// = Implementation for MySubClass
// ================================

#import MySubClass.h

@implementation MySubClass
//OVERRIDING a Super Private method.
-(void) privateInstanceMethod
{
  [super privateInstanceMethod]; //Compiler error, privateInstanceMethod not visible!
  //Do something else
}
@end

うまくいけば、誰かがすでにこれを理解しています。

乾杯!

4

2 に答える 2

13

この GNUStep ページでは、セクション 4.5 で 1 つのアプローチについて説明しています。

...これの明るい面は、保護されたメソッドもシミュレートできることです。このために、サブクラスの作成者は、保護されたメソッドについて何らかの方法で通知する必要があり、コンパイラの警告に耐える必要があります。別の方法として、Protected カテゴリを別のインターフェイス ファイル (たとえば、"PointProtected.h") で宣言し、このインターフェイス ファイルを、サブクラスのインターフェイス ファイルによってのみインポートおよび使用する必要があることを理解して提供することもできます。

于 2009-10-17T16:55:24.597 に答える
13

Apple では、フレームワークをビルドするときの典型的なパターンは、パブリック ヘッダー (MyClass.h) とプライベート ヘッダー (MyClass_private.h) を持ち、パブリック ヘッダーのみをビルド プロダクトにコピーすることです。もちろん、.m ファイルは両方を #import します。

于 2009-10-17T22:37:57.750 に答える