Objective C - 类别和继承 - 将方法添加到base并将覆盖添加到派生类

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)

显然,这是一个人为/简化的例子.但它很适合展示我想做的事情.本质上,我想为继承层次结构中的多个类提供附加功能.

这是一个安全/有效的类别使用?任何陷阱?

Dav*_*d V 1

这是使用类别的可接受的方式。类别实际上会将消息添加到类中,因此该消息将像任何其他消息一样工作。这包括继承。

也许需要注意的一件事是您可能会遇到名称冲突。我不知道运行时如何处理它们,但是如果两个类别提供相同的消息,您可能会出现意外的行为,因为您期望的消息没有被调用。话虽这么说,您可能只想要一个比 更有特色的名称serialize,当然,除非您需要该名称(例如您有一个非正式协议)。