繁体   English   中英

UIVIew超类对象调用子类方法,而不是其自己范围内的方法

[英]UIVIew superclass object calling subclass method instead of method in its own scope

我的超类定义了一个称为“ 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

在此处输入图片说明

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM