2012-06-01 3 views
2

Я очень новичок в объекте C, и я хочу знать, возможно ли, как и как я хотел бы сделать. У меня есть несколько классовОбъект Objective-C, созданный базовым классом, в определенный класс

@interface A: NSObject 
{ 
    NSString* Aa; 
    NSUInteger Ab; 
} 

    @interface B: A 
{ 
    NSString* Ba; 
    NSUInteger Bb; 
} 

    @interface C: A 
{ 
    NSString* Ca; 
    NSUInteger Cb; 
} 

Я хочу создать функцию, где я ожидал «A» типа объекта и в чеке implementataion, если их типа B или C позже. Вот что я хочу:

-(void)doSomething:(A *param) 
{ 
    //do some stuff 
    if(param is an inscance of B) 
    { 
     //do stuff with B 
    } 
    else 
    { 
     //do stuff with C 
    } 
} 

Как это сделать?

С уважением,

Золи

ответ

6

Проверить NSObject по методу isKindOfClass: (класс) с Вы могли бы сделать это:

-(void)doSomething:(A *)param 
{ 
    //do some stuff 
    if([param isKindOfClass:[B class]]) 
    { 
     //do stuff with B (cast will be required to avoid warnings!) 
     B *castedB = (B *)param; 
     //... 
    } 
    else if ([param isKindOfClass:[C class]]) 
    { 
     //do stuff with C 
     C *castedC = (C *)param; 
     //... 
    } 
} 

Надежда эта помощь!

+1

Но в идеале вы использовали бы полиморфизм и утиную типизацию: определите общие методы в 'A', затем переопределите эти методы в' B' и 'C', чтобы делать вещи, специфичные для B и C. (В этом случае, в зависимости от того, должен ли 'A' знать, как делать что-либо само по себе, вы можете сделать сам' A' скорее протоколом, чем классом.) – echristopherson

5

Там же четыре метода, вы можете использовать:

  • isKindOfClass: испытания, если объект является членом класса или подкласса
  • isMemberOfClass: же, как и выше, но более конкретно, не позволяет подклассы
  • respondsToSelector: проверить, отвечает ли объект данному селектору, например [param respondsToSelector:@selector(method:)]. Полезно для утиного ввода.
  • conformsToProtocol: тест, если объект реализует протокол.