klo*_*ffy 9 inheritance objective-c categories
我知道不应该使用类别来覆盖它们正在扩展的类中的方法.但是,下面的场景呢?
考虑这些课程:
Base.h
#import <Foundation/NSObject.h>
@interface Base: NSObject { NSNumber *n; }
@end
Run Code Online (Sandbox Code Playgroud)
Derived.h
#import "Base.h"
@interface Derived: Base { NSString *s; }
@end
Run Code Online (Sandbox Code Playgroud)
有类别:
基地+ Serialize.h
#import "Base.h"
@interface Base (Serialize)
- (NSString*)serialize;
@end
Run Code Online (Sandbox Code Playgroud)
基地+ Serialize.m
#import "Base+Serialize.h"
@implementation Base (Serialize)
- (NSString*)serialize
{
return [NSString stringWithFormat:@"%@", n];
}
@end
Run Code Online (Sandbox Code Playgroud)
派生+ Serialize.h
#import "Derived.h"
#import "Base+Serialize.h"
@interface Derived (Serialize)
- (NSString*)serialize;
@end
Run Code Online (Sandbox Code Playgroud)
派生+ Serialize.m
#import "Derived+Serialize.h"
@implementation Derived (Serialize)
- (NSString*)serialize
{
return [NSString stringWithFormat:@"%@, %@", s, [super serialize]];
}
@end
Run Code Online (Sandbox Code Playgroud)
显然,这是一个人为/简化的例子.但它很适合展示我想做的事情.本质上,我想为继承层次结构中的多个类提供附加功能.
这是一个安全/有效的类别使用?任何陷阱?
这是使用类别的可接受的方式。类别实际上会将消息添加到类中,因此该消息将像任何其他消息一样工作。这包括继承。
也许需要注意的一件事是您可能会遇到名称冲突。我不知道运行时如何处理它们,但是如果两个类别提供相同的消息,您可能会出现意外的行为,因为您期望的消息没有被调用。话虽这么说,您可能只想要一个比 更有特色的名称serialize,当然,除非您需要该名称(例如您有一个非正式协议)。