2010-04-05 3 views
3

У меня есть объект iPodLibraryGroup, а Исполнитель и альбом оба наследуются от него.Могу ли я избежать явного литья объектов с общим подклассом?

Когда дело доходит до контроллеров моего представления, хотя я нахожу, что я дублирую много кода, например, у меня есть ArtistListViewController и AlbumListViewController, хотя они оба делают в основном то же самое.

Причина, по которой я закончил дублирование кода, заключается в том, что каждый из этих контроллеров представлений ссылается либо на объект Artist, либо на объект al Album, и я не уверен, как его настроить, чтобы один контроллер представления мог обрабатывать оба - эти диспетчеры представлений в основном получают доступ к методам, которые общие объекты относятся к iPodLibraryGroup.

В качестве примера, мы надеемся сделать это яснее рассмотреть этот код в AlbumListViewController:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    Album *album = nil; 
    album = [self albumForRowAtIndexPath:indexPath inTableView:tableView]; 

    … 

    if (!album.thumbnail) 
    { 
     [self startThumbnailDownload:album forIndexPath:indexPath inTableView:tableView]; 
     cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"];     
    } 
    else 
    { 
     cell.imageView.image = album.thumbnail; 
    } 


    return cell; 
} 

Это, по существу, полностью повторяется (наряду с чертовски много больше, повторил код) в ArtistListViewController просто так, что я могу Приведите локальную переменную в качестве исполнителя вместо альбома.

Есть ли способ явно не указывать здесь Исполнитель или Альбом, чтобы один и тот же код мог работать для любого объекта, который является дочерним элементом iPodLibraryGroup?

ответ

0

На основе suggestion received on twitter я создал протокол о iPodLibraryGroup следующим образом:

@protocol iPodLibraryGroup <NSObject> 
@required 

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain, readonly) NSString *sort_name; 

… 

- (void)downloadImageFromURL:(NSURL *)image_url; 
- (void)cancelImageDownload; 
- (void)downloadImageCannotStart; 

@end 


@interface iPodLibraryGroup : NSObject <iPodLibraryGroup> { 

… 

} 

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

id <iPodLibraryGroup> source; 

Единственная проблема, с которой я столкнулся, заключалась в вызове методов NSObject, я получил бы предупреждение о компиляторе:

Этот вопрос обсуждается в How to typecast an id to a concrete class dynamically at runtime? и я решил его отливка мою «источник» ссылка как (iPodLibraryGroup *) перед вызовом метода NSObject, например:

[(iPodLibraryGroup *)source addObserver:self forKeyPath:@"pendingResponseForDetailedInfo" options:0 context:nil]; 
3

Рефакторинг вашего кода, чтобы у вас был общий ListViewController, который работает с объектами iPodLibraryGroup, и ArtistListViewController & AlbumListViewController как наследует его.

Направьте все общие части до общего контроллера ListViewController, и ваши контроллеры Artist/Album реализуют/переопределяют методы, которые должны вести себя по-разному.

+0

это будет работать я тоже себе представить, но решение протокола я помечен как ответ был гораздо быстрее. – prendio2

 Смежные вопросы

  • Нет связанных вопросов^_^