Категория, протокол, один большой класс? Что я должен использовать здесь - PullRequest
5 голосов
/ 26 апреля 2011

Я пытаюсь реализовать универсальный класс чисел.По сути, моему приложению необходимо получить строку от пользователя и проанализировать ее, чтобы определить, является ли она имперской (в футах или любой их комбинации) или метрикой (мм см мм или любой комбинированной).Моя идея состояла в том, чтобы сделать классы Metric & Imperial, оба из которых имеют более общий тип Number.Затем пользовательский интерфейс создает объект Number, передаваемый в строке для анализа, и число определяет, является ли он метрическим или имперским.Я вижу, как это будет легко сделать, создав 1 класс больших чисел, который делает это, но мне кажется, что я должен отделить метрические и имперские классы от стандартного интерфейса (Number), поскольку они будут выполнять гораздо больше, чем просто анализ строки.

Поэтому, если я сделаю Number *num = [[Number alloc] initWithString:someString];, я получу подкласс Number, специфичный для Imperial или Metric.Это действительно то, где я знаю, что что-то не имеет смысла, но я не уверен, как это сделать.

Что было бы хорошим способом справиться с этим?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011

Что, по вашему мнению, неправильно в вашем предложении?

То, что вы хотите сделать и как его решить, в точности соответствует концепции Какао, называемой "кластерами классов", описанной в Руководстве по основам какао .Apple использует этот шаблон повсеместно в Foundation и AppKit.

2 голосов
/ 26 апреля 2011

Я бы создал подкласс NSFormatter , чтобы выполнить преобразование между строками и объектами вашего пользовательского класса. Таким образом, вы можете связать средство форматирования с элементами управления пользовательского интерфейса, и тогда они автоматически предоставят вам объекты правильного типа.

Зависит от того, как вы используете ваши фактические цифры. Например, вы можете иметь общий числовой класс с именем Length и подклассы с именами LinegthInInches и LengthInMetres (скажем). Или вы можете пойти с одним классом, у которого есть свойство, называемое юнитами, которое говорит вам, являются ли юниты футами или метрами или чем-то еще. Или у вас может быть протокол, который определяет необходимые методы, которые любой объект должен реализовать, чтобы считаться одним из ваших чисел. Таким образом, вы можете добавить категорию к NSNumber, чтобы она соответствовала вашему протоколу.

Я бы, вероятно, выбрал первый вариант, то есть плоскую иерархию классов с подклассом для каждого типа модуля. Ваш подкласс NSNumberFormatter определит, какой подкласс чисел возвращать, основываясь на заданной строке, и отформатирует свои строки на основе класса заданного числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...