一个古怪的解决方案是创建一个抽象超类,它可以为您提供正常的属性综合。然后创建一个您将实际使用的具体子类,它只是实现和覆盖方法(相同的签名)并调用 super 来进行实际设置。这允许你在调用 super 的实现之前或之后做任何你想做的事情。
例子:
@interface ALTOClassA : NSObject
@property NSString *catName;
@end
除了这个测试的存根文件之外,.m 中不需要其他任何东西。
创建子类,在@interface 中不需要特别的东西
#import "ALTOClassA.h"
@interface ALTOClassAJunior : ALTOClassA
@end
在@implementation 中,我们进行了覆盖。
#import "ALTOClassAJunior.h"
@implementation ALTOClassAJunior
- (void)setCatName:(NSString*)aCatName {
NSLog(@"%@",NSStringFromSelector(_cmd));
[super setCatName:aCatName];
NSLog(@"after super: self.catName %@", self.catName);
}
@end
正在使用:
ALTOClassAJunior *aCAJ = [ALTOClassAJunior new];
NSLog(@"aCAS.catName %@", aCAJ.catName);
NSLog(@"set it to George.");
[aCAJ setCatName:@"George"];
NSLog(@"aCAS.catName %@", aCAJ.catName);
这允许您利用自动生成的代码,并且仍然可以对您的课程做您想做的事情。抽象超类通常是许多事情的有用解决方案。