Вход/Регистрация
Программирование на Objective-C 2.0
вернуться

Кочан Стивен

Шрифт:

Во-первых, определяя переменную как объект из определенного класса, мы используем так называемый статический контроль типов (static typing). Слово статический означает, что переменная всегда используется для хранения объектов из определенного класса, поэтому класс объекта, хранящегося в этом типе, заранее определен, то есть является статическим. При использовании статического контроля типов компилятор обеспечивает согласованное использование этой переменной во всей программе. Компилятор может проверить, определен ли (или унаследован) метод, применяемый к объекту, и если нет, то выводит предупреждающее сообщение. Таким образом, если вы объявляете в своей программе переменную класса Rectangle с именем myRect, то компилятор проверяет, все ли методы, которые вы вызываете для myRect, определены в классе Rectangle или наследуются из его суперкласса.

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

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

Еще одним доводом к применению статического контроля типов является то, что он делает ваши программы более удобными для чтения. Рассмотрим объявление id f1;

и сравним его с Fraction *f1;

Конечно, второе объявление лучше, поскольку в нем указывается предполагаемое использование переменной И. Сочетание статического контроля типов и осмысленных имен переменных позволяет делать программы самодоку- ментируемыми. Типы аргументов и возвращаемых значений при динамическом контроле типов

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

Компилятор выполняет проверку на согласованность в объявлениях каждого класса, которые он встречает. Если один или несколько методов не согласуются с типом аргумента или возвращаемого значения, компилятор выводит предупреждающее сообщение. Например, оба класса, Fraction и Complex, содержат метод add:, но класс Fraction принимает в качестве аргумента и возвращает объект типа Fraction, а класс Complex - объект типа Complex. Если trad и myFract - объекты типа Fraction, a compl и myComplex — объекты типа Complex, то определения result = [myFract add: trad];

и result = [myComplex add: compl];

не вызовут проблемы. В обоих случаях получатель сообщения доступен для статического контроля типов и компилятор может проверить согласованность при использовании метода, поскольку он определен в классе получателя. Если dataValuel и dataValue2 — переменные типа id, то выражение result = [dataValuel add: dataValue2];

заставляет компилятор генерировать код для передачи данного аргумента методу add: и обработки его возвращаемого значения, делая некоторые предположения.

Во время выполнения система runtime Objective-C проверит конкретный класс объекта, хранящегося в dataValuel, и выберет метод из подходящего класса для выполнения. Однако в более общем случае компилятор может генерировать неверный код для передачи методу аргументов или обработки его возвращаемого значения. Это может произойти, например, если один метод принял в качестве аргумента какой-либо объект, а другой — значение с плавающей точкой, или один метод возвратил объект, а другой — целое значение. Если методы отличаются только типом объекта (например, метод add: класса Fraction принимает в качестве аргумента и возвращает объект типа Fraction, а метод add: класса Complex принимает в качестве аргумента и возвращает объект типа Complex), то компилятор же будет генерировать правильный код, поскольку адреса памяти (то есть указатели) в обоих случаях будут передаваться как ссылки на объекты. 9.5. Как задавать вопросы о классах

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

Является ли данный объект прямоугольником (rectangle)?

Поддерживает ли данный объект метод print?

Является ли данный объект членом класса Graphics или одного из его потомков?

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

В таблице 9.1 приводится сводка основных методов, поддерживаемых классом Object. В таблице объект-класс (object-class) — это объект, получаемый для заданного класса (обычно он генерируется с помощью метода class), а с е л е к т о р (s e le c to r ) — это значение типа SEL (обычно создается с помощью директивы @selector).

Табл. 9.1. Методы для работы с динамическими типами Метод Вопрос или действие -(BOOL) isKindOfClass: объект-класс Является ли объект членом о б ъ е к т а -к л а с с а или дочернего класса? -(BOOL) isMemberOfClass: объект-класс Является ли объект членом о б ъ е к т а - к л а с с а ? -(BOOL) respondsToSelector: селектор +(B00L) instancesRespondToSelector: селектор +(B00L)isSubclass0fClass: объект-класс Может ли объект отвечать на метод, указанный с е л е к т о р о м ? Могут ли экземпляры указанного класса отвечать на с е л е к т о р ? Является ли объект подклассом указанного класса? -(id) performSelector: selector -(id) performSelector: селектор withObject: объект -(id) performSelector: селектор withObject: объект 1 withObject: объект2 Применение метода, указанного селектором. Применение метода, указанного селектором , с передачей аргумента о б ъ е к т . Применение метода, указанного селектором , с передачей аргументов объект1 и объект2.

  • Читать дальше
  • 1
  • ...
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: