【问题标题】:subclassing convenience construtctor子类化便利构造函数
【发布时间】:2012-02-11 22:14:02
【问题描述】:

如果我有一个带有如下便利构造函数的超类(使用 ARC):

+(id)classA {
    ClassA *foo = [[ClassA alloc] init];

    return foo;
}

如果我用一个名为 ClassB 的类来继承 ClassA,并且我想重写便利构造函数,那么以下是正确的:

+(id)classB {
    ClassB *foo = [ClassA classA];

    return foo;
}


(假设我不能在 ClassB 上调用 alloc 和 init)。

谢谢!

【问题讨论】:

    标签: objective-c convenience-methods


    【解决方案1】:

    类方法传递self 就像一个实例方法,只有在类方法的情况下self 的值是Class 的一个实例。因此,将您的 classA 方法更改为:

    + (id) classA
    {
       return [[self alloc] init];
    }
    

    (这只是您从NSObject 继承的new 的定义。约定是newX 返回一个保留引用,而classnameX 返回一个自动释放的引用。使用ARC 的区别确实没有实际意义,但我我会和newX一起去。)

    现在如果ClassBClassA 的子类,那么[ClassB classA] 将调用classA,而selfClassB,您将使用allocinit 一个ClassB 实例。

    【讨论】:

      【解决方案2】:

      不,这是不正确的,因为它分配、初始化并返回 ClassA,而不是 ClassB。这样做的唯一方法是不显式使用 ClassA:

      + (id) classA
      {
          return [[self alloc] init];
      }
      

      当然,你也可以使用老式的new

      ClassB *myB = [ClassB new];
      

      FWIW,假设我想做的不仅仅是分配和初始化,而且我的类被命名为 Gadget,那么我会做类似的事情:

      + (id) gadgetWithNumber: (int) num
      {
          return [[self alloc] initWithNumber: num];
          // or without ARC:
          // return [[[self alloc] initWithNumber: num] autorelease];
      }
      

      当然,这假设我的班级中有一个initWithNumber: 方法。

      【讨论】:

      • 如何继承 UIButton。我看到很多人继承子类,在构造函数中他们做了类似MyBtnClass *myBtn = [MyBtnClass buttonWithType:UIButtonTypeCustom]
      • 好的,如果您在 UIButton 上调用这样的“构造函数”,Objective-C 将返回正确的类型。但它的工作方式不同。查看我的编辑。
      • @CRD:据我了解,[X new]; 是创建对象的原始方式,但后来决定分配和初始化是两个不同的过程,因此[[X alloc] init]; 成语变得流行起来。
      猜你喜欢
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      相关资源
      最近更新 更多