如何声明返回基类的方法

时间:2014-02-03 14:06:10

标签: ios iphone objective-c class

我想添加一个返回Class的方法,如下所示:

-(Class) validatorClass{

return [AddItemValidator class]; }

并像这样使用它:

self.validator = [[self validatorClass] alloc] initWithParentDirectory:self.parentDirectory];

我应该如何声明此方法的返回类型-(Class)以仅允许返回从已定义类扩展的类?

我想返回-(Class<'NameValidator'>)之类的内容,其中AddItemValidatorNameValidator延伸。

我该如何宣布?

1 个答案:

答案 0 :(得分:1)

正如SomeGuy所提到的,在这种情况下你无法实现编译时的安全性。相反,您可以使用断言在运行时检查它(最好不要):

-(Class) validatorClass{
    Class theClass = [AddItemValidator class];
    NSAssert([theClass isSubclassOfClass:[NameValidator class]], @"Has to return subclass of %@", [NameValidator class]);
    return theClass;
}

您甚至可以更进一步,在此处应用工厂模式,将验证者类与正在验证的类分离:

@implementation NameValidatorFactory

+(NameValidator*)validatorForObject:(YourObjectType*)validatedObject {
  //choose proper validator depending on your object's type or anything you want
  if([validatedObject isKindOfClass:[YourObjectTypeSuperclass class]]) {
    return [AddItemValidator alloc];
  }
  else {
  // handle other cases 
  }

  }

然后创建你的验证器:

self.validator = [[NameValidatorFactory validatorForObject:self] initWithParentDirectory:self.parentDirectory];