ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

Более подробно о классах

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

Для сохранения кучи сил, было бы замечательно создавать на основе того, что уже было создано и написано другими программистами, вместо того чтобы вручную разрабатывать с самого начала. Если вы, например, хотите создать окно с особыми свойствами (или возможностями), вам всего лишь требуется добавить код, реализующий эти возможности, и не нужно писать код, для обработки остального поведения окна, такого как закрытие или минимизация окна. Создавая на основе того что уже написано другими программистами, вы можете наследовать все реализованные ими типы поведения окна. Этот факт отличает Objective-C от чистого C.

Как же это сделано? Итак, существует класс окна (NSWindow), и вы можете написать класс который наследуется от этого класса. Возможно вы добавите какое-то определённое поведение в ваш собственный класс окна. Что же произойдет если ваше окно получит сообщение «Close»? Ведь вы не писали никакого кода для обработки этого сообщения, а так же не копировали код для этих целей в ваш класс. Попросту говоря, если класс вашего окна не содержит кода для определённого метода, сообщение автоматически передается для обработки классу, от которого было унаследовано ваше окно (т.е. его суперклассу). И если необходимо, этот процесс повторяется до тех пор, пока обработчик сообщения не будет найден (или не будет достигнут самый родительский класс всей иерархии наследования в данном случае).

Если метод не может быть найден, то посланное вами сообщение не будет обработано. Это словно поиск гаража для смены шин, когда даже его владелец не в силах оказать помощь вам. В таких случаях Objective-C укажет на ошибку.

Но что, если вы хотите использовать свою собственную обработку для метода, уже унаследованного от родительского класса? Это легко, вы имеете возможность переопределить необходимые методы. Например, вы можете написать код, который при нажатии кнопки закрытия окна, перемещает его из области видимости, ещё до действительного его закрытия. Ваш особый класс окна может использовать те же имена методов для закрытия окна, что определены Apple. Итак, когда ваше окно получает сообщение о закрытии, выполняется ваш переопределённый метод, вместо метода определённого Apple. Таким образом, окно может убираться из области видимости, до того как оно будет фактически закрыто.

Да, обработка закрытия окна уже реализована программистами Apple. Внутри нашего метода закрытия окна мы легко можем вызывать метод закрытия окна-родителя, хотя порядок его вызова слегка отличается, для того чтобы удостовериться, что наш собственный метод не будет вызываться рекурсивно.

<code data-result="[object Object]">// Код для закрытия окна. 
[super close]; // Вызов метода close родительского класса</code>

Существует один класс, являющийся родительским для всех остальных, как царь горы, и называется он NSObject. В общем, все классы, которые вы когда-либо создадите или будете использовать, будут являться классами-потомками класса NSObject, прямо или косвенно. Например класс NSWindow является потомком от класса NSResponder, который в свою очередь потомок от NSObject. В классеNSObject определены общие методы для всех объектов (например генерация текстового описания объекта, опрос объекта способен ли он обработать передаваемое сообщение и т. д.).

Это лишь начальная информация о понятии наследования. Более подробно этот вопрос раскрыт в уроке Наследование.

Comments are closed.