将不可变复制属性作为可变保留继承

时间:2011-11-23 11:38:32

标签: objective-c

我有以下代码:

@interface Room : NSObject
{
@protected
    NSMutableDictionary* mCustomProperties;
}

@property (readonly, copy) NSDictionary* CustomProperties;

@end



@interface MutableRoom : Room
{
}

@property (readwrite, retain) NSMutableDictionary* CustomProperties;

@end

稍后通过访问mCustomProperties实现这些属性。 我知道,不允许重新声明子类中的内存管理属性或属性的数据类型与基类中的属性不同。 但是,我想实现以下目标: - 只提供对不可变基类中字典的只读访问权限。由于该成员是一个NSMutableDictionary,只是将它作为NSDictionary的保留实例返回意味着,当属性的用户将访问变量作为NSObject实例存储在某处然后恢复它时,简单的强制转换会使它再次变得可变,甚至是无意的它的原始类型以后再回来。因此,我想在readonly属性中通过不可变副本返回可变字典。 - 为可变子类中的字典提供完全读写访问权限。因为你不仅应该能够在那里存储另一个字典,而且只是改变现有字典的内容,我希望子类中的属性不仅要被读写,而且要保留,而不是复制,所以将访问原始值,并将其作为NSMutableDictionary访问,而不是作为NSDictionary访问,以便可以通过属性添加,删除或更改字典的条目。

除了抑制警告或使用两个不同命名的属性之外,还有更优雅的方法吗?

1 个答案:

答案 0 :(得分:1)

当声明一个类集群的可变/不可变对时,我经常发现从另一个继承是最简单的,但是要使用内部类来实现,像这样:

// Room.h
@interface Room : NSObject
// ...
@end

@interface MutableRoom : Room
// ...
@end

// MONRoom.h
@class RoomImp;

@interface MONRoom : Room
{
@private
    RoomImp * imp;
}

@property (readonly, copy) NSDictionary* CustomProperties;

@end

@interface MONMutableRoom : MutableRoom
{
@private
    RoomImp * imp;
}

@property (readwrite, retain) NSMutableDictionary* CustomProperties;

@end

// RoomImp.h
@interface RoomImp : NSObject
{
@private
    NSMutableDictionary* mCustomProperties;
}

// ...

@end