Классы Objective-C

В этой главе описаны некоторые лингвистические и структурные особенности Objective-C, связанные с классами; в следующей главе мы рассмотрим то же самое по отношению к экземплярам.

 

Подкласс и суперкласс

В языке Objective-C, как и во многих других объектно-ориентированных языках, предоставляется механизм для указания отношения между двумя классами: они могут быть подклассом и суперклассом по отношению один к другому. Например, у нас может быть класс Quadruped (четвероногих) и класс Dog (собак), и мы делаем Quadruped суперклассом для Dog. Класс может иметь много подклассов, но один непосредственный суперкласс. Я говорю “непосредственный”, потому что суперкласс может иметь свой суперкласс, и так далее в растущей цепи, до тех пор, пока мы не достигнем конечного суперкласса, именуемого базовым, или корневым, классом.

Поскольку класс может иметь много подклассов, но только один суперкласс, существует иерархическое дерево подклассов, получающееся путем ветвления из суперкласса, где каждый подкласс может стать источником дерева своих подклассов. Полное дерево начинается с одного базового класса в верхней части. В действительности каркас Cocoa состоит из одного (огромного!) дерева иерархически организованных классов еще до того, как вы напишете хоть одну строку кода или создадите собственный класс. Диаграмму этого дерева можно представить как схему, на вершине которой находится один глобальный суперкласс, все его непосредственные подклассы — уровнем ниже, а каждый из их непосредственных подклассов — еще одним уровнем ниже и т.д. Среда Xcode готова показать вам такую схему (рис. 4.1): для этого в окне проекта iOS выберите View ^Navigators'^ Show Symbol Navigator и щелкните на Hierarchical при выбранных (синего цвета) первой и третьей пиктограммах на панели фильтров.

Просмотр иерархии встроенных классов в среде Xcode

Рис. 4.1. Просмотр иерархии встроенных классов в среде Xcode

Причина существования отношения класс-подкласс заключается в том, чтобы разрешить классам совместно использовать имеющуюся функциональность. Предположим, например, у нас есть класс Dog и класс Cat, и мы рассматриваем определение метода ходьбы для обоих из них. Мы могли бы рассуждать, что собаки и кошки ходят в значительной степени одинаково, так как оба являются четвероногими. Поэтому может иметь смысл определить walk (ходьбу) как метод класса Quadruped и сделать Dog и Cat подклассами класса Quadruped. В результате получится, что и для Dog, и для Cat могут быть отправлены сообщения walk, даже если ни один из них не имеет такого метода, потому что каждый из них имеет суперкласс, в котором есть метод walk. Мы говорим, что подкласс наследует методы своего суперкласса.

Целью создания подклассов является не просто то, что класс может наследовать методы другого класса. Подкласс может также определять свои собственные методы. Как правило, подкласс состоит из методов, наследуемых от своего суперкласса, и еще некоторых собственных методов. Если класс Dog не имеет собственных методов, то трудно понять, почему он должен существовать отдельно от класса Quadruped. Но если Dog знает, как сделать что-то, что умеет делать не каждый из представителей класса Quadruped — скажем, лаять, — то появляется смысл в его существовании как отдельного класса. Если мы определим метод bark в классе Dog и метод walk в классе Quadruped и сделаем Dog подклассом Quadruped, то Dog наследует способность ходить от класса Quadruped, но при этом будет уметь лаять.

Подкласс может также переопределять методы, унаследованные от его суперкласса. Например, возможно, некоторые собаки лают не так, как другие. У нас может быть класс, например NoisyDog, который является подклассом Dog. Класс Dog определяет метод bark, но и NoisyDog также определяет метод bark, причем определяет его не так, как класс Dog. Это называется замещением (overriding). Совершенно естественное правило гласит, что если подкласс переопределяет метод, унаследованный от его суперкласса, то когда соответствующее сообщение отправляется экземпляру этого подкласса, вызывается версия метода, определенная в подклассе.

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


 

 

 

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