цель c - создание NSManagedObject и обычных классов NSObject, которые наследуются от одного и того же родительского класса - PullRequest
4 голосов
/ 15 января 2012

В моем приложении для iPhone у меня есть два viewController: viewController1 имеет tableView, который показывает список объектов Item1 viewController2 имеет tableView, который показывает список объектов Item2

Где класс Item1 и класс Item2 наследуются от абстрактного класса ParentItem.

Теперь я хочу сделать объект Item2 NSManagedObject, чтобы я мог сохранить его на устройстве и заставить viewController2 использовать NSFetchedResultsController для загрузки его tableView с объектами Item2.

Но я не хочу, чтобы Item1 был NSManagedObject, я хочу использовать его как обычный объект.

Проблема в том, что если я создам класс ParentItem как NSManagedObject, то класс Item1 также будет NSManagedObject, и я не смогу использовать его как обычный объект (я имею в виду, что не смогу создать объект Item1 с обычным alloc-init или я могу ???)

И если я создам класс ParentItem как обычный NSObject, то класс Item2 также будет обычным NSObject.

1 Ответ

9 голосов
/ 15 января 2012

Скорее всего, вам нужен интерфейс, который могут реализовать оба класса.Я буду использовать пример человека:

@protocol PersonInterface <NSObject>

@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;

@end

Класс, наследующий от NSObject

@interface NonManagedPerson : NSObject <PersonInterface>
@end

@implementation NonManagedPerson

@synthesize firstName = _firstName;
@synthesize lastName  = _lastName;

@end

Класс, наследующий от NSManagedObject

@interface ManagedPerson : NSManagedObject <PersonInterface>
@end

@implementation ManagedPerson

@dynamic firstName;
@dynamic lastName;

@end

Теперь, если объекту необходимо использовать какой-либо из этих классов, ему все равно, какой у него супертип, он будет заботиться только о том, чтобы объект реагировал на -firstName, -lastName, -setFirstName или -setLastName.

Чтобы обеспечить такую ​​гибкость, вам необходимо убедиться, что объекты, которые вы хотите использовать, соответствуют интерфейсу, поскольку вас больше не беспокоит конкретный тип, например:

@interface FootballClub : NSObject

@property (nonatomic, retain) id<PersonInterface> clubManager;

// .. other properties

@end

Обновление

Чтобы получить совместную реализацию, вы можете рассмотреть композицию / делегирование.

Композиция

Высоздайте другой класс, который инкапсулирует общую работу, а затем используйте его в качестве ивара для использования в вашем классе.

Делегирование

Сделайте то же самое, что и другие общиеэлементы, такие как UITableView.В определенные моменты он вызывает datasource (любой элемент, который реализует требуемые методы <UITableViewDatasource>), чтобы попросить что-то сделать.Затем вы можете иметь два объекта, использующих один и тот же класс в качестве источника данных, и реализация будет общей.

...