之前对类方法的继承一直很朦胧,今日看着书突然想通了,写了个例子证实了下想法
下面是两个类,一个是父类CCFather, 一个是子类CCSon继承自CCFather
#import <Foundation/Foundation.h>
@interface CCFather : NSObject
- (NSString *)name;
+ (NSString *)classNameOfSelf;
- (void)doSth;
@end
#import "CCFather.h"
@implementation CCFather
- (NSString *)name {
return @"Father";
}
+ (NSString *)classNameOfSelf {
return @"CCFather";
}
- (void)doSth {
NSLog(@"classNameOfSelf: %@", [[self class] classNameOfSelf]);
}
@end
#import "CCFather.h"
@interface CCSon : CCFather
@end
#import "CCSon.h"
@implementation CCSon
- (NSString *)name {
return @"Son";
}
+ (NSString *)classNameOfSelf {
return @"CCSon";
}
@end
验证的代码在下面,关键在于调用类方法的时候不要直接使用[xxClassName xxFunction];而跟对象方法一样,使用[[self class] xxFunction],这样在实时运行时会根据对应的class去调用对应的class方法,就像例子中的 doSth方法一样
CCFather *f = [[CCFather alloc] init];
CCSon *son = [[CCSon alloc] init];
NSLog(@"father: %@ %@", f.name, [CCFather classNameOfSelf]);
[f doSth];
NSLog(@"son: %@ %@", son.name, [CCSon classNameOfSelf]);
[son doSth];
输出结果是如下,最核心的结果是分别调用doSth方法,CCSon的输出的ClassName是CCSon,CCFather输出的ClassName是CCFather,在子类中正确的调用了被子类覆盖的类方法,而不用在CCSon中覆盖doSth方法,再明确的调用[CCSon classNameOfSelf]
2014-02-12 00:21:39.674 Demo[1044:907] father: Father CCFather
2014-02-12 00:21:39.675 Demo[1044:907] classNameOfSelf: CCFather
2014-02-12 00:21:39.676 Demo[1044:907] son: Son CCSon
2014-02-12 00:21:39.676 Demo[1044:907] classNameOfSelf: CCSon