0

私のスーパー クラスは、構築時にのみ呼び出される「commonInit」というプライベートメソッドを定義します。

スーパー クラスは 2 つの追加クラスによって派生し、それぞれが「commonInit」と呼ばれるメソッドも実装します。

派生クラスのオブジェクトを作成しているときに、サブクラス メソッドがスーパークラスのスコープから呼び出されていることがデバッガーに表示されます。

これは非常に危険な動作のようです - 偶然にもスーパークラスのプライベートメソッドを「上書き」するような些細なケースでも

スーパークラスのメソッドの名前を変更せずに、この動作を克服するにはどうすればよいですか?

例:

@interface ASuperView : UIView
@end

@implementation ASuperView
-(id)init
{
  self = [super init];
  if(self)
  {
    [self commonInit]; // BOOM - The derived view method is called in this scope
  }
  return self;
}

-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
  if(self)
  {
    [self commonInit];
  }
  return self;
}

-(void)commonInit
{
  //setup the view
}

@end

@interface ADerivedView : ASuperView

@end

@implementation ADerivedView
-(id)init
{
  self = [super init];
  if(self)
  {
    [self commonInit];
  }
  return self;
}

-(id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if(self)
  {
    [self commonInit];
  }
  return self;
}

-(void)commonInit
{
  //setup the view for the derived view
}
@end

この画像では、PXTextBox から派生した PXTextMessageBox

両方ともメソッド common init をプライベートに宣言します

ここに画像の説明を入力

4

2 に答える 2

1

obj-c には「プライベート」メソッドのようなものはありません。せいぜい、ヘッダーのコンシューマーからメソッドの存在を隠すことができますが、設計上、オブジェクトへの参照を持っている人は誰でも、ヘッダーでそのメソッドが定義されていなくても、実装されているメソッドを呼び出すことができます。最善の策は、_private_commonInit などの新しいメソッドを定義し、それをクラス ヘッダーで共有しないことです。

于 2013-09-03T14:22:03.627 に答える
0

これは実際には設計によるものだと思います。ポリモーフィズムも最高!.. self は、実際には最初にメッセージを送信したオブジェクトを参照します (これは常に self が表示されるクラス インスタンスではありません) ... これを解決する 1 つの方法は、Init がチェーンされているのと同じ方法で commonInit をチェーンすることです ... a [super commonInit] を呼び出すと、サブクラスから正しいメソッドが呼び出されます ...

于 2013-09-03T14:12:09.503 に答える