从Objective-C中的实例访问类方法

时间:2011-10-10 01:35:37

标签: objective-c

鉴于以下课程,

@interface MyBaseClass : NSObject

-(void)printName
+(NSString*)printableName

@end

如何在不明确引用+printableName的情况下从实例方法-printName中调用类方法MyBaseClass[[self class] printableName]无法编译。

我们的想法是子类将覆盖+printableName,因此-printName应以多态方式为其类调用相应的+printableName

3 个答案:

答案 0 :(得分:1)

将MyBaseClass声明为

@interface MyBaseClass : NSObject

并且您的[[自我类]名称]应该编译。

这为我编译:

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

@implementation MyBaseClass

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

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

@end 

答案 1 :(得分:0)

您是否尝试过[object_getClass(this) printableName]

(但你知道,当然,你也可以创建

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

在每个课程中并致电[self printableName2]?)

答案 2 :(得分:0)

根据您的描述,它应该有效。由于您没有提供实施,我们无法分辨出什么是错误的。

基于这个问题,我为polymorphism in 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;
}