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

Этот тип, именуемый классом, является объектно-ориентированным аналогом типа данных в С. Так же как простая переменная в С может иметь тип данных int или float, так и объект в мире объектно-ориентированного программирования может быть dog или NSString. В мире объектно-ориентированного программирования идея этого механизма заключается в том, сколько индивидуальных объектов будут действовать одинаковым образом.

Например, может быть несколько собак. Возможно, у вас есть собака Тузик, у меня — собака Шарик. Но обе наши собаки знают, как сидеть, лежать и лаять. В объектно-ориентированном программировании они знают это, потому что оба принадлежат к одному классу Dog. Перечисленные выше знания являются частью класса Dog. Ваш Тузик и мой Шарик обладают этим знанием только потому, что они являются объектами класса Dog.

С точки зрения программиста смысл сказанного прост: весь код, который мы создаем, размещается в классе. Все методы, которые мы пишем, будут частью того или иного класса. Вы не программируете отдельную собаку как отдельный объект — вы программируете класс Dog.

Я только что говорил, что объектно-ориентированная программа работает путем отправки сообщений отдельным объектам. Так что, даже несмотря на то, что программист не пишет код для отдельных “собачьих объектов”, все равно в программе должны существовать отдельные собаки, чтобы было кому отправлять сообщения. Класс Dog знает, как лают, но только конкретная собака может залаять в ответ на команду. Соответственно возникает вопрос: если весь код собаки находится в классе Dog, то откуда берутся отдельные собаки?

Ответ заключается в том, что они должны создаваться в ходе работы программы. Когда программа запускается, она содержит код класса Dog, но не объекты отдельных собак. Чтобы получить лай какой-то собаки, программе необходимо сначала создать эту собаку — объект класса Dog. Этот объект будет принадлежать классу Dog, поэтому ему может быть отправлено сообщение “голос”. Отдельный объект, принадлежащий классу Dog (или любому иному классу), является экземпляром этого класса. Изготовление отдельного объекта, являющегося экземпляром класса, называется созданием экземпляра этого класса.

Классы существуют как отражение того факта, что на первом месте находится программа: именно в них находится выполняемый код программы. Экземпляры же класса создаются преднамеренно и индивидуально в процессе работы программы. Каждый экземпляр создается из класса, является экземпляром этого класса и имеет методы в силу того, что эти методы имеет класс. Экземпляру могут быть отправлены сообщения; что он будет делать в ответ на получение сообщения, зависит от того, какой код класс содержит в своих методах. Экземпляр является отдельным объектом, которому можно отправлять сообщения; класс же с его методами является средоточием возможности реагировать на них (рис. 2.1).

Класс и экземпляр

Рис. 2.1. Класс и экземпляр

Поскольку каждый отдельный объект является экземпляром класса, чтобы знать, какие сообщения официально можно отправлять этому объекту, необходимо по меньшей мере знать, какими методами наделил объект его класс. Такая открытая информация является API этого класса. (Класс может также иметь методы, которые вы не должны вызывать вне объекта; они не являются открытыми, и другие объекты не имеют права отправлять такие сообщения экземпляру данного класса.) Именно по этой причине документация каркаса Cacao от Apple состоит в основном из перечисления и описания методов, предоставляемых разными классами. Например, чтобы узнать, какие сообщения вы можете отправлять объекту (экземпляру) NSString, следует начать с изучения документации класса NSString. Это просто большой список методов, который говорит о том, что может делать объект NSString. Это хотя и не вся информация о классе NSString, но по крайней мере большая ее часть.


 

 

 

Добавить комментарий