鉴于以下课程,
@interface MyBaseClass : NSObject
-(void)printName
+(NSString*)printableName
@end
如何在不明确引用+printableName
的情况下从实例方法-printName
中调用类方法MyBaseClass
? [[self class] printableName]
无法编译。
我们的想法是子类将覆盖+printableName
,因此-printName
应以多态方式为其类调用相应的+printableName
。
答案 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;
}