В чем разница между классами и протоколами - PullRequest
3 голосов
/ 13 декабря 2011

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

Может ли кто-нибудь привести пример простыми словами?

Спасибо

Ответы [ 6 ]

12 голосов
/ 13 декабря 2011

Класс служит образцом для создания одного или нескольких объектов на основе конкретной реализации этого класса.Хорошей аналогией является форма для нарезки сдобного печенья.Атрибуты формы (форма, размер, высота) определяют файлы cookie, которые вы можете вырезать вместе с ним.У вас есть только одна форма (класс), но вы можете создать с ее помощью множество файлов cookie (экземпляров этого класса, т. Е. Объектов).Все куки основаны на этой конкретной форме.Точно так же все объекты, которые являются экземплярами этого класса, идентичны по своим атрибутам.

Classes = data и методы (специальные функции), всеСофистически связаны друг с другом.

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

Все методы , определенные в классе, имеют Определение - которое определяет имя метода + какие (если есть) данные, которые методы принимают для обработки и что (если таковые имеются) данные, которые методы выкладывают для обработки кем-то другим.Все методы, определенные в классе, также имеют Реализацию - фактический код, обеспечивающий обработку - это внутренние методы методов. Внутри есть код, который обрабатывает данные, а также может запрашивать другие методы для подпроцессинга.данные.Таким образом, класс - очень благородный тип в программировании.

Если вы понимаете вышесказанное, вы поймете, что такое протокол.

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

Давайте снова проведем аналогию с реальной жизнью, это помогает.Если вы приедете ко мне домой, чтобы прожить здесь неделю, вам нужно будет придерживаться моего протокола TidyUp.Протокол TidyUp определяет три метода - мыть посуду каждый день, убирать комнату и проветривать свежий воздух.Эти три метода, я их определяю .. вы что-то будете делать.Но мне абсолютно все равно, как должна выглядеть реализация, я просто номинально определяю методы.Вы будете реализовывать их, т.е. вы определяете, как будут выглядеть детали этой работы (эти методы).Я просто говорю: придерживайтесь моего протокола и реализуйте его так, как считаете нужным.

Финал - Вы можете объявить некоторый класс.Вы также можете отдельно объявить протокол.И затем вы можете объявить, что этот класс, в дополнение к его собственным методам, будет принимать или придерживаться этого протокола, т.е.класс реализует методы протокола.

2 голосов
/ 13 декабря 2011

Простые слова из Язык программирования Objective-C объясняют назначение протоколов просто:

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

  • Чтобы объявить методы, которые другие должны реализовать
  • Чтобы объявить интерфейс к объекту, скрывая его класс
  • Чтобы зафиксировать сходство между классами, которые не связаны иерархически

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

Делегирование является хорошим примером того, почему протокол полезен. Рассмотрим, например, протокол UITableViewDataSource. Любой класс может принять этот протокол, и любой класс, который делает это, может использоваться в качестве источника данных для таблицы. Табличному представлению не важно, какой тип объекта выступает в качестве источника данных; его заботит только то, что объект, выступающий в качестве источника данных, реализует определенный набор методов. Вы можете использовать наследование для этого, но тогда все объекты источника данных должны быть получены из общего базового класса (более конкретного, чем NSObject). Вместо этого использование протокола позволяет таблице рассчитывать на возможность вызова таких методов, как -tableView:willBeginEditingRowAtIndexPath: и -tableView:heightForRowAtIndexPath:, без необходимости знать что-либо еще об источнике данных.

2 голосов
/ 13 декабря 2011

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

1 голос
/ 13 декабря 2011

Несколько меньшая разница, чем на других языках.Интерфейс (эквивалентный классу Java / C ++) определяет структуру данных объектов и может определять некоторое подмножество их методов (включая, конечно, возможность определения всего набора).Протокол определяет только подмножество методов без определения данных.

Важно, что интерфейс может наследовать только от одного другого интерфейса (который, конечно, может наследовать от интерфейса, который наследуется от интерфейса, которыйнаследует ...), но интерфейс может реализовать любое количество протоколов.Таким образом, два различных интерфейса без общего наследования (кроме NSObject) могут реализовывать один и тот же протокол и, таким образом, «удостоверять», что они предоставляют одинаковые функции.(Хотя с помощью Objective-C вы можете с помощью нескольких приемов вызывать методы интерфейса, которые не объявлены извне ни в объявлении интерфейса, ни в протоколе, поэтому протоколы в какой-то степени являются просто «синтаксическим сахаром» или чем-то подобным.)

1 голос
/ 13 декабря 2011

Основное различие между классами и протоколами заключается в том, что написание протоколов полезно для реализации методов делегатов.

в примере у нас есть класс A и класс B, и мы хотим вызвать метод в классе A из класса B.

Вы можете прочитать очень ценный пример этого в этой статье

http://iosdevelopertips.com/objective-c/the-basics-of-protocols-and-delegates.html

чтение кода стоит тысячи слов; -)

это помогло мне в первый раз, когда мне пришлось использовать их

0 голосов
/ 13 декабря 2011

Протокол определяет, что может делать класс, например, интерфейс в Java или c #

Класс - это фактическая реализация, которая выполняет эту работу.

Достаточно просто? :)

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