子类化Objective C类方法

时间:2012-04-25 18:45:46

标签: objective-c ios oop inheritance

我对Subclassing和Class方法有疑问。

我有一个基类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;
}

有效吗?

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

干杯!

2 个答案:

答案 0 :(得分:6)

这样可以正常工作。

可能更好的方法是以这样一种方式定义你的便利构造函数,使你不需要来覆盖它:

 + (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]] ;
}

答案 1 :(得分: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允许实例化的类在不覆盖类方法的情况下发生变化。