首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使子类符合目标C中的协议?

如何使子类符合目标C中的协议?
EN

Stack Overflow用户
提问于 2019-04-30 13:44:41
回答 1查看 53关注 0票数 1

我有一个基类实现的协议。我有一些子类,我想对它们强制执行协议。

代码语言:javascript
复制
@class JSData;

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

基类是

代码语言:javascript
复制
@interface JSData : NSObject <JSDataProtocol, JSHashable, JSEquatable>
@end

然后我正在创建其他类,如

代码语言:javascript
复制
@interface JSSymbol: JSData
- (NSString *)name;
- (JSData *)value;
@end

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 14:38:21

JSSymbol是从JSData派生的,后者已经实现了JSDataProtocol方法。所以no,您不能因为没有实现这些方法而获得编译时错误。

如果你真的想这样做,你可以:

  • JSDataProtocol声明从JSData向下移动到具体的类。
  • 彻底摆脱JSData,使JSDataProtocol继承JSHashable & JSEquatable

如果您摆脱了JSData,您的协议定义可以简化为:

代码语言:javascript
复制
@protocol JSDataProtocol <NSObject, NSCopying, NSMutableCopying, 
                          JSHashable, JSEquatable>

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

@end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55922301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档