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

在此图像中,PXTextMessageBox 派生自 PXTextBox

两者都私下声明了方法 common init

在此处输入图像描述

4

2 回答 2

1

obj-c 中没有“私有”方法之类的东西。充其量您可以向标头的使用者隐藏方法的存在,但是通过设计,任何对您的对象有引用的人都可以调用它实现的任何方法——即使他们没有在标头中定义该方法。你最好的办法是定义一个新方法,比如_private_commonInit,而不是在你的类头中共享它。

于 2013-09-03T14:22:03.627 回答
0

我相信这实际上是设计使然。多态性甚至是最好的!.. self 实际上是指最初发送消息的对象(它并不总是 self 出现的类实例)......解决这个问题的一种方法是将 commonInit 以与 Init 被链接的相同方式链接......调用 [super commonInit] 将从子类调用正确的方法...

于 2013-09-03T14:12:09.503 回答