2014-02-03 5 views
0

Я хотел бы добавить метод, который возвращает Class, как показано ниже:как объявить метод, который возвращает базовый класс

-(Class) validatorClass{ 

возвращение [AddItemValidator класс]; }

и использовать его как это:

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

Как я должен объявить тип возвращаемого -(Class) этого метода позволяет возвращающийся только классы, которые простираются от определенного класса?

Я хотел бы вернуть что-то вроде -(Class<'NameValidator'>), где AddItemValidator распространяется от NameValidator.

Как я могу объявить об этом?

+0

Вы можете использовать «идентификатор», а затем напечатанный к соответствующему классу. – user2071152

+0

Что вы хотите достичь этим? Запретить компиляцию, если переменная неправильного класса указана с левой стороны? – heximal

+1

Невозможно сделать, просто взгляните на метод layerClass UIView + (Class). – SomeGuy

ответ

1

Как уже упоминалось в OneGuy, в этом случае вы не можете обеспечить безопасность во время компиляции. Вместо этого, вы можете использовать утверждение, чтобы он проверил на время выполнения (лучше, чем ничего):

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

Вы можете даже пойти дальше и применить Factory шаблон здесь, чтобы расцепить класс валидатора из класса проверяемого:

@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]; 
+0

Спасибо, за вашу помощь. – MarekM

Смежные вопросы