Доступ к методам класса из экземпляра в Objective-C - PullRequest
0 голосов
/ 10 октября 2011

Учитывая следующий класс,

@interface MyBaseClass : NSObject

-(void)printName
+(NSString*)printableName

@end

как я могу вызвать метод класса +printableName из экземпляра метода -printName без явной ссылки на MyBaseClass? [[self class] printableName] не компилируется.

Идея состоит в том, что подклассы будут переопределять +printableName, поэтому -printName должен полиморфно вызывать соответствующий +printableName для своего класса.

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Объявите MyBaseClass как

@interface MyBaseClass : NSObject

и ваше [[self class] name] должно скомпилироваться.

Это компилирует для меня:

@interface MyBaseClass : NSObject
-(void)printName;
+(NSString*)printableName;
@end

@implementation MyBaseClass

-(void)printName
{
    [[self class] printableName];
}

+(NSString*)printableName {
    return @"hello";
}

@end 
0 голосов
/ 10 октября 2011

Из того, что вы описываете, должно работать.Поскольку вы не предлагали свою реализацию, мы не сможем сказать, что не так.

На основе этого вопроса я написал пример кода для полиморфизма в Objective-C .
Он содержит полиморфизм, основанный на наследовании, но также и полиморфизм, основанный на формальных и неформальных протоколах.Можете ли вы проверить свой код по этому.

здесь выдержка:

#import <Foundation/Foundation.h>

/*
 * 1.: Polymorphism via subclassing 
 */
@interface MyBaseClass : NSObject
-(void)printName;
+(NSString*)printableName;
@end

@implementation MyBaseClass

+(NSString *)printableName
{
    return NSStringFromClass(self);
}

-(void)printName
{
    NSLog(@"%@", [[self class] printableName]);
}

@end


@interface MySubBaseClass : MyBaseClass
@end

@implementation MySubBaseClass
@end

//...

int main (int argc, const char * argv[])
{

    /*
     * 1.: Polymorphism via subclassing. As seen in any Class-aware OO-language
     */
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    MyBaseClass *myBaseObject = [[MyBaseClass alloc] init];
    [myBaseObject printName];
    [myBaseObject release];

    MySubBaseClass *mySubBaseObject = [[MySubBaseClass alloc] init];
    [mySubBaseObject printName];
    [mySubBaseObject release];

    //...

    [pool drain];
    return 0;
}
0 голосов
/ 10 октября 2011

Вы пробовали [object_getClass(this) printableName]?

(Но вы, конечно, понимаете, что вы также можете просто создать версию

-(NSString*)printableName2 {
    return [MyBaseClass printableName]; 
}

в каждом из ваших классов и позвонить [self printableName2]?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...