5

我有一个关于子类化和类方法的问题。

我有一个MyBaseClass具有便利类方法的基类

+ (id)giveMeAClassUsing:(NSString *)someParameter;

MyBaseClass不是单例。

现在,我想创建一个 的子类MyBaseClass,我们称之为MyChildClass。我也希望有相同的类方法MyChildClass。此外,我还希望MyChildClass在我这样做时初始化一个实例变量。

会做这样的事情:

+ (id)giveMeAClassUsing:(NSString *)someParameter {

      MyChildClass *anInstance = [super giveMeAClassUsing:someParameter];
      anInstance.instanceVariable = [[UIImageView alloc] initWithFrame:someFrame];

      return anInstance;
}

有效吗?

感谢您的所有帮助(提前)并解决我的困惑并澄清一些概念!

干杯!

4

2 回答 2

8

那会很好用。

可能更好的是以不需要覆盖它的方式定义您的便利构造函数:

 + (id)myClassWithString: (NSString *)string {
     return [[[self alloc] initWithString:string] autorelease];
 }

无论调用哪个超类或其任何子类,这都会做正确的事情。

然后只更改子类initWithString:中的方法来处理初始化:

- (id)initWithString: (NSString *)string {
    return [self initWithString:string andImageView:[[[UIImageView alloc] initWithFrame:someFrame] autorelease]] ;
}
于 2012-04-25T18:51:10.607 回答
5

绝对是有效的。

一个注意事项是在超类中,用 引用类本身self,而不是按名称引用超类。

这是不好的:

// MySuperClass // BAD :(
+ (id)giveMeAClassUsing:(NSString *)someParameter {
  return [[[MySuperClass alloc] initWithParam:someParameter] autorelease];
}

但这很好!

// MySuperClass // GOOD! :D
+ (id)giveMeAClassUsing:(NSString *)someParameter {
  return [[[self alloc] initWithParam:someParameter] autorelease];
}

否则,当您子类化然后调用 super 时,您实际上并没有初始化正确的类。的使用self允许被实例化的类在不覆盖类方法的情况下发生变化。

于 2012-04-25T18:50:46.520 回答