Скорее всего, вам нужен интерфейс, который могут реализовать оба класса.Я буду использовать пример человека:
@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>
), чтобы попросить что-то сделать.Затем вы можете иметь два объекта, использующих один и тот же класс в качестве источника данных, и реализация будет общей.