子类化Objective C类方法

cod*_*rer 3 oop inheritance objective-c ios

我有一个关于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;
}
Run Code Online (Sandbox Code Playgroud)

有效吗?

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

干杯!

Jos*_*ell 6

那会很好.

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

 + (id)myClassWithString: (NSString *)string {
     return [[[self alloc] initWithString:string] autorelease];
 }
Run Code Online (Sandbox Code Playgroud)

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

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

- (id)initWithString: (NSString *)string {
    return [self initWithString:string andImageView:[[[UIImageView alloc] initWithFrame:someFrame] autorelease]] ;
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*yne 5

绝对是有效的.

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

这是不好的:

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

但这很好!

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

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