2009-11-08 3 views
1

Я создаю приложение, которое имеет интерфейс master-detail, аналогичный iTunes. Он имеет ту же иерархию данных, что и плейлисты iTunes (за исключением того, что я не допускаю, чтобы группы «плейлистов» делали вещи простыми). Другими словами, есть обычные плейлисты, в которых их отдельные элементы добавляются вручную пользователем. Есть интеллектуальные плейлисты, которые показывают все элементы, которые соответствуют пользовательскому предикату. Наконец, есть некоторые «плейлисты», которые вообще не редактируются пользователем (я называю эти DefaultFolders), но по сути это не что иное, как фантастические умные плейлисты, в которых их предикат должен показать все. Это похоже на разделы «Библиотека» и «Фильмы» в iTunes.Лучшая реализация для структуры списка воспроизведения, подобной iTunes?

В моей попытке воссоздать эту структуру, я придумал следующую иерархию (в Core Data): http://gallery.me.com/davedelong#100084/Screen%20shot%202009-11-07%20at%207.17.53%20PM&bgcolor=black (надеюсь, это само за себя)

Однако, как я получил дальше в этом приложение, эта структура стала немного громоздкой. Например, я определил аксессор в классе AbstractFolder под названием -(NSSet *)items, так что все конкретные типы папок (DefaultFolder, SmartFolder и Folder) могут легко получить их содержимое. Это совпадает с отношением, которое имеет объект Folder с объектом Item. Однако я не могу реализовать аксессуар items в AbstractFolder, потому что это заменит созданный аксессуар, предоставленный Core Data для объекта Folder. Я думал о том, чтобы сделать его частью протокола, который все конкретные папки будут реализовывать, но это, похоже, преследует цель наследования.

Поэтому я открываю это до коллективной мудрости списка рассылки. Есть ли лучший способ смоделировать эту структуру? Кто-нибудь из вас работал над приложениями с похожими структурами? Что вы нашли полезной?

ответ

0

Извините, я не использовал Core Data так много, но мне непонятно, почему вам нужно реализовать элемент accessors в AbstractFolder? Разве вы не можете просто вставить его в категорию в заголовке и не потрудиться, чтобы его реализовать? Это стандартный подход для абстрактных методов.

Например, в AbstractFolder.h, вы бы:

@interface AbstractFolder (Abstract) 

NSSet *items; 

@end 

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

+0

Я реализовать его в 'AbstractFolder', потому что он является наиболее общим из всех папок. Когда я разбираюсь с папкой в ​​коде, мне часто не нужно знать, в какой папке она есть, и поэтому я обычно рассматриваю их как 'AbstractFolder'. –

+0

Правильно, но мне кажется, что вы не можете иметь общую реализацию в AbstractFolder; вы хотите, чтобы подклассы выполняли его, но вы хотите, чтобы AbstractFolder объявлял об этом. Я обновил свой ответ, чтобы показать вам, как вы это делаете. –