如何使子类符合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
我有一个基础 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