Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
#1

Категории - Objective-C

25.02.2015, 14:22. Просмотров 821. Ответов 8
Метки нет (Все метки)

Не могу разобраться в чем польза от категорий.

Если я правильно понял, то мы прописываем категорию в классе как-нибудь вот так:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//.m
@interface ViewController(myCategory)
 
- (void) categoryMethod;
 
@end
 
@implementation ViewController
 
-(void) categoryMethod
{
    NSLog(@"something");
}
 
@end
и дальше можем использовать этот метод со всеми экземплярами этого класса и со всеми экземплярами классов-наследников.

и какой смысл так делать, если можно просто объявить метод в .h и реализовать в .m? Соответственно все классы-наследники также получат этот метод.

единственный смысл использования я углядел только в случае, когда нет доступа к исходному коду (и опять же: чем выгоднее создание категории, нежели простого добавления или переопределение методов в этом классе?). Только как это будет выглядеть на практике я не понимаю (если можно, приведите пример, когда мы используем класс, к коду которого у нас нет доступа)? и как в таком случае сделать категорию к классу, к которому мы не имеем исходника. В каком файле писать
Objective-C
1
@interface *classname here* (category)
?

Заранее спасибо
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2015, 14:22     Категории
Посмотрите здесь:

Добавить свойство категории - Objective-C
Добрый вечер. Я пытаюсь добавить свойства категории, делаю всё как в этот туториале...

Можно ли сделать в NSTableView категории? - Objective-C
Доброго времени суток, господа. Есть вопрос. Можно ли сделать в NSTableView категории, чтоб при выборе какой-нибудь строки она...

Почему в категории нельзя добавлять поля instance method? - Objective-C
Почему в категории нельзя добавлять поля instance method?

Код в представлении генерирует ссылки на категории товаров: при щелчке по категории идёт 404 ошибка - C# MVC
плин Добавлено через 14 секунд Этот код в представлении генерирует ссылки на категории товаров как я понимаю @foreach (var p in...

Категории, под категории, под под категории, добавление товара - PHP
Не мог бы кто мне помочь с категориями, под категориями и под под категориями. Проблема в том, что в админке сделано добавление товара с...

При выборе новой категории динамические элементы ,которые появились при выборе предыдущей категории ''скрылись' - Delphi
Как сделать чтобы при выборе новой категории динамические элементы ,которые появились при выборе предыдущей категории ''скрылись'' ...

Категории - PHP
Доброго времени суток, помогите кто может, вывожу на главной посты с мини все подряд, хотелось бы по категориям, то есть: наименование 1...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
25.02.2015, 17:27     Категории #2
Цитата Сообщение от lowlol Посмотреть сообщение
в чем польза от категорий
Добавить классу дополнительную функциональность, очевидно.

Цитата Сообщение от lowlol Посмотреть сообщение
и какой смысл так делать, если можно просто объявить метод в .h и реализовать в .m?
Если это твой личный класс, то да. Хотя иногда даже для собственных классов имеет смысл создавать категориии с целью логического выделения группы методов класса.

Цитата Сообщение от lowlol Посмотреть сообщение
когда нет доступа к исходному коду (и опять же: чем выгоднее создание категории, нежели простого добавления или переопределение методов в этом классе?)
Нельзя добавить или переопределить метод закрытого класса без наследования. А наследование нужно далеко не всегда. Простой пример:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// NSString+Extensions.h
@interface NSString (Extensions)
 
- (BOOL)isAllDigits;
 
@end
 
// NSString+Extensions.m
#import "NSString+Extensions.h"
 
@implementation NSString (Extensions)
 
- (BOOL)isAllDigits {
    NSCharacterSet *nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    NSRange range = [self rangeOfCharacterFromSet:nonNumbers];
 
    return range.location == NSNotFound;
}
 
@end
Стоит ли ради подобного наследоваться от NSString и создавать лишнюю сущность?
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
26.02.2015, 16:09  [ТС]     Категории #3
Цитата Сообщение от Melzas Посмотреть сообщение
Если это твой личный класс, то да. Хотя иногда даже для собственных классов имеет смысл создавать категориии с целью логического выделения группы методов класса.
в смысле сделать методы из категории невидимыми для других классов?

Цитата Сообщение от Melzas Посмотреть сообщение
Нельзя добавить или переопределить метод закрытого класса без наследования. А наследование нужно далеко не всегда. Простой пример
а можно это в одном файле сделать? вот так:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
// NSString+Extensions.m
 
@interface NSString (Extensions)
 
- (BOOL)isAllDigits;
 
@end
 
@implementation NSString (Extensions)
 
- (BOOL)isAllDigits {
    NSCharacterSet *nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    NSRange range = [self rangeOfCharacterFromSet:nonNumbers];
 
    return range.location == NSNotFound;
}
 
@end
Vorona
Peace 2 all shining faces
667 / 529 / 45
Регистрация: 05.03.2010
Сообщений: 1,273
27.02.2015, 03:41     Категории #4
Цитата Сообщение от lowlol Посмотреть сообщение
в смысле сделать методы из категории невидимыми для других классов?
нет, просто семантически выделить поведение, выраженное в метадах

может слышали из других языков о таком понятии, как миксины (mixins)
просто подмешиваете какое-то дополнительное поведение, при этом не влияя на саму иерархию и внутреннюю структуру

Цитата Сообщение от lowlol Посмотреть сообщение
а можно это в одном файле сделать? вот так:
для этого вам стоит разобраться на более начальном уровне с языком
и когда разберетесь, то поймете, для чего служат header файлы и почему это сделать нельзя

Ну, т.е. вообще-то можно, но все методы, объявленные в .m файле имплементации, не будут видны в публичном интерфейсе

Вобщем можно так сделать, но доступ к этому методу будет только внутри категории, а не извне
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
27.02.2015, 19:54  [ТС]     Категории #5
Vorona, я понимаю для чего нужны хэдер и файл реализации.
Я неправильно выразился. Имелось в виду "Допускает ли "хороший стиль" объявить и реализовать методы в одном файле?"
Цитата Сообщение от Vorona Посмотреть сообщение
Ну, т.е. вообще-то можно, но все методы, объявленные в .m файле имплементации, не будут видны в публичном интерфейсе
Вобщем можно так сделать, но доступ к этому методу будет только внутри категории, а не извне
а если сделать это в .h файле и каждый раз его импортировать в тот файл, где нам нужны будут методы категории?

Добавлено через 21 минуту
Vorona, то есть я .m файл вообще не буду делать, а после объявления в .h напишу реализацию.
Vorona
Peace 2 all shining faces
667 / 529 / 45
Регистрация: 05.03.2010
Сообщений: 1,273
28.02.2015, 00:45     Категории #6
Цитата Сообщение от lowlol Посмотреть сообщение
Vorona, я понимаю для чего нужны хэдер и файл реализации.
судя по всему – нет
серьезно, разберитесь сначала и все дурацкие вопросы отпадут сами

Цитата Сообщение от lowlol Посмотреть сообщение
Vorona, то есть я .m файл вообще не буду делать, а после объявления в .h напишу реализацию.
как вы думаете почему файл реализации называется так? и почему файл заглавий называется так?
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
02.03.2015, 19:04  [ТС]     Категории #7
Цитата Сообщение от Vorona Посмотреть сообщение
как вы думаете почему файл реализации называется так? и почему файл заглавий называется так?
в заголовочном файле объявляются те методы, которые должны быть видны из других классов (другими словами интерфейс). Плюс ivar'ы и property.
в файле реализации расписываются тела этих методов (то есть их реализация).
Таким образом осуществляется отделение реализации от интерфейса.
Vorona
Peace 2 all shining faces
667 / 529 / 45
Регистрация: 05.03.2010
Сообщений: 1,273
04.03.2015, 03:15     Категории #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
кул, тогда вы поняли, почему нельзя писать реализацию в .h файле?

возможно это и можно сделать физически, даже скорее всего возможно в C++ точно, но для этого у вас должны быть ну очень веские причины, не говоря уже о том, что будет случаться с компилятором, когда он будет импортировать header файлы всякий раз... (тут я ничего говорить не стану, так как не знаток таких тонкостей)
можно так же в #define макросах описывать просто какую-то функциональность

Вобщем не стоит этого делать и все (разве что вы - какой-то злобный эзотерик), вряд ли кто-то это оценит или поймет, то же самое, что вы ждали бы трамвая на троллейбусной остановке
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2015, 18:37     Категории
Еще ссылки по теме:

Категории - MySQL
Здравствуйте, пытаюсь изучить как работать с категориями. подскажите пожалуйста как реализовать: имеется 3 категории которые связаны с...

Категории - PHP БД
Здравствуйте, пытаюсь изучить как работать с категориями. подскажите пожалуйста как реализовать: имеется 3 категории которые связаны с...

категории - PHP
подскажите как это $dig_count = strlen($m); if ($dig_count == 6) $dig = '6 значный'; elseif ($dig_count == 7) $dig = '7 значный';...

Категории - WordPress
Как отнести запись сразу к нескольким категориям? Сайт недвижимости.Допустим у меня запись "однокомнатная на ленина 25000" надо чтобы...

Считывание из категории - Java SE
Подскажите как в цикле сделать считывание файлов из категории, чтобы загружался файл 1 и файл 2, потом файл 1 и файл 3 ... файл 1, файл n,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
04.03.2015, 18:37  [ТС]     Категории #9
Vorona, потому что у других классов будет доступ к реализации, что нежелательно, потому что нарушается принцип инкапсуляции.

Цель вопроса, как раз-таки была в том, чтобы узнать, возможно ли это физически и какие неочевидные последствия это будет иметь.

Спасибо за разъяснения.
Yandex
Объявления
04.03.2015, 18:37     Категории
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru