наследовать неизменяемое свойство копии как изменяемое сохранение - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть следующий код:

@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 Ответ

1 голос
/ 23 ноября 2011

при объявлении изменяемой / неизменной пары кластера классов, я часто считаю, что проще всего не наследовать от другого, но использовать внутренний класс для реализации, например, так :

// 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...