Objective-C中的相互引用类和子类
我有两组不可变/可变类型Objective-C中的相互引用类和子类,objective-c,inheritance,Objective C,Inheritance,我有两组不可变/可变类型 @class AAA; @class BBB; @class MutableAAA; @class MutableBBB; @interface AAA : NSObject @property (readonly,nonatomic,copy) BBB* bbb; @end @interface BBB : NSObject @property (readonly,nonatomic,copy) AAA* aaa; @end @inte
@class AAA;
@class BBB;
@class MutableAAA;
@class MutableBBB;
@interface AAA : NSObject
@property (readonly,nonatomic,copy) BBB* bbb;
@end
@interface BBB : NSObject
@property (readonly,nonatomic,copy) AAA* aaa;
@end
@interface MutableAAA : AAA
@property (readwrite,nonatomic,copy) MutableBBB* bbb;
@end
@interface MutableBBB : BBB
@property (readwrite,nonatomic,copy) MutableAAA* aaa;
@end
因为Objective-C支持返回类型协方差,这是完全合法的,但问题是两个类相互引用,我不知道如何让编译器在定义它之前知道MutableBBB
是BBB
的一个子类
当然,我可以回退到category来解决这个问题,但我想在主接口体中定义这些,因为这是基本类定义的一部分,而不是额外的方法
当前Clang正在生成警告。我如何在没有警告的情况下做到这一点
更新
我的意图是公开可变类类型,以便在对象树上进行就地编辑<代码>只读/读写实际上并不重要。我想我有两个选择,我想避免
- 使用类别
- 添加独立的可变版本访问器。(如
中的NSMutableData
方法)-mutableBytes
我只是想知道是否有一些我还不知道的未知特性支持这种相互引用的子类化。这是一个比看起来更容易的问题,这要归功于语言的最新进展。这正是类扩展存在的原因,为了说明我的观点,我定义了一个接口和一个伪方法文件
// CFIAAAsAndBBBs.h
@class AAA;
@class BBB;
@interface AAA : NSObject
@property (readonly,nonatomic,copy) BBB* bbb;
@end
@interface BBB : NSObject
@property (readonly,nonatomic,copy) AAA* aaa;
@end
@interface MutableAAA : AAA
@end
@interface MutableBBB : BBB
@end
首先,注意我对标题所做的更改。您可以将读写属性移动到实现文件中,而不是在头中公开读写属性。如果您需要将它们公开给任何其他对象,只需使用您定义的超类而不是它们的可变副本声明另一组readwrite
属性。通过这种方式,可以避免公开易变性,并且如果需要在内部readwrite
重新声明属性,可以在以后的类扩展中安全地重新声明该属性。说到内部readwrite
属性,下面是m文件:
// CFIAAAsAndBBBs.m
#import "CFIAAAsAndBBBs.h"
@interface MutableAAA ()
@property (readwrite,nonatomic,copy) MutableBBB* bbb;
@end
@interface MutableBBB ()
@property (readwrite,nonatomic,copy) MutableAAA* aaa;
@end
//...
没有更多的警告,每个人都是赢家。警告是什么?警告是:
测试。m:18:55:警告:属性类型“MutableBBB*”与从“AAA”继承的类型“BBB*”不兼容。
我必须赞扬你的问题的种类和级别,伙计。关于Objective-C语言,你的历史中充满了一些我在网站上见过的最吸引人的问题。好吧,类扩展可以被认为是一种类别,我的意图是公开mutator方法。我认为分类是我最后的选择。你不应该首先暴露可变属性。使用mutator方法作为类别的包装器。