Supponiamo di avere una classe di modello di base astratta chiamata MoneySource. E due realizzazioni BankCard e CellularAccount. In MoneysSourceListViewController voglio visualizzare un elenco di essi, ma con ListItemView diverso per ogni sottoclasse di MoneySource.
Cosa succede se definisco una categoria su MoneySource
@interface MoneySource (ListItemView)
- (Class)listItemViewClass;
@end
E poi sostituiscilo per ogni sottoclasse concreto di MoneySource, restituendo una classe di visualizzazione adatta.
@implementation CellularAccount (ListItemView)
- (Class)listItemViewClass
{
return [BankCardListView class];
}
@end
@implementation BankCard (ListItemView)
- (Class)listItemViewClass
{
return [CellularAccountListView class];
}
@end
@implementation MoneySourceListController
- (ListItemView *)listItemViewForMoneySourceAtIndex:(int)index
{
MoneySource *moneySource = [items objectAtIndex:index];
Class viewClass = [moneySource listItemViewClass];
ListItemView *view = [[viewClass alloc] init];
[view setupWithMoneySource:moneySource];
return [view autoreleased];
}
@end
quindi posso chiedere all'oggetto del modello la sua vista, non violando i principi MVC ed evitando l'introspezione della classe o le costruzioni.
Grazie!