如何使子类符合Objective-C中的协议?

How to make a subclass conform to a protocol in Objective-C?

我有一个基础 class 实现的协议。我有 subclasses 我想为其执行协议。

@class JSData;

@protocol JSDataProtocol <NSObject, NSCopying, NSMutableCopying>
@property (nonatomic, readonly) NSString *dataType;
@property (nonatomic, readwrite) id value;
- (JSData *)value;
- (BOOL)hasMeta;
// ...
@end

基础class是

@interface JSData : NSObject <JSDataProtocol, JSHashable, JSEquatable>
@end

然后我正在创建其他 class 类似

@interface JSSymbol: JSData
- (NSString *)name;
- (JSData *)value;
@end

但这里的问题是因为 JSData 符合 JSDataProtocol,如果我错过了在 JSSymbol 中实现某些方法,Xcode 不会显示任何警告,我得到运行时错误。有没有办法强制 JSSymbol 实现 JSDataProtocol 中定义的所有方法?

JSSymbol 派生自 JSData,它已经实现了 JSDataProtocol 方法。所以没有,你不会因为没有实现这些方法而得到编译时错误。

如果你真的想要这个,你可以:

  • JSDataProtocol 声明从 JSData 向下移动到具体的 类。
  • 完全摆脱 JSData 并使 JSDataProtocol 继承自 JSHashable & JSEquatable

如果去掉JSData,你的协议定义可以精简为:

@protocol JSDataProtocol <NSObject, NSCopying, NSMutableCopying, 
                          JSHashable, JSEquatable>

@property (nonatomic, readonly) NSString *dataType;
@property (nonatomic, readwrite) id<JSDataProtocol> value;
@property (nonatomic, readonly) BOOL hasMeta;

@end