Это вопрос дизайна класса с Objective-C.Вот пример:
Файловые системы имеют файлы и каталоги.Оба являются "узлами".Например, при обходе каталога получается список узлов, некоторые из которых являются [подкаталогами], а другие - файлами.
Это указывает на следующий абстрактный вид иерархии классов на стороне клиента:
@interface Node: NSObject {}
@end
@interface Directory: Node {}
@end
@interface File: Node {}
@end
Пока все хорошо.На данный момент все три класса являются абстрактными.Переходя к реализации, вы понимаете, что есть два основных маршрута: использование URL-адресов (рекомендуется Apple для Mac OS X ≥ 10,6) или пути (единственный возможный путь для Mac OS X ≤ 10,5 или Cocotron ).
Итак, теперь вам нужно разработать две конкретные реализации каждого из трех указанных выше абстрактных классов:
// Node subclasses
@class NodeWithPath;
@class NodeWithURL;
// Directory subclasses
@class DirectoryWithPath;
@class DirectoryWithURL;
// File subclasses
@class FileWithPath;
@class FileWithURL;
Теперь рассмотрим, скажем, FileWithURL
:
- это файл, поэтому он должен наследовать от
File
. - это узел, реализованный с URL, поэтому он должен наследовать от
NodeWithURL
Но File
и NodeWithURL
не находятся в одной строке иерархии классов.Без множественного наследования нет способа выразить это в Objective-C.
Так как бы вы разработали эту ситуацию?Я вижу две идеи:
- использовать протоколы, которые являются ограниченной формой множественного наследования.
- использовать члены (отношения has-a вместо is-a).
Я склоняюсь к идее протокола.В этом случае Directory
и File
будут протоколами, а шесть конкретных классов будут наследоваться от общего суперкласса Node
и соответствовать их аналогичному протоколу.Node
будет иметь две иерархии подклассов: одну с использованием URL-адресов, другую с использованием путей.
Теперь существует проблема сокрытия реализации от клиентского кода.Для этого можно настроить кластер классов с помощью общего суперкласса Node
.Код клиента получит объекты, набранные как Node<File>
или Node<Directory>
в зависимости от обстоятельств.
Какие-либо дополнительные / другие / похожие / разные идеи?