Классы и объекты
Эта глава не предназначена для того, чтобы изучать по ней основы объектно-ориентированного программирования (ООП). Мы лишь хотим дать представление о том, как основные идеи ООП реализованы в языке Perl. Начнем с краткого обзора этих идей. В основе ООП лежат понятия класса и объекта. Эти понятия тесно связаны друг с другом.
Класс представляет собой сочетание структуры данных и тех действий, которые можно выполнить над этими данными. Данные называют свойствами, а действия – методами. Совмещение в классе структуры данных и действий над ними называют инкапсуляцией.
Объект является экземпляром класса. Свойства объекта обусловлены его принадлежностью к определенному классу. Понятия "объект" и "класс" отражают два различных вида иерархий, которые можно обнаружить в любой достаточно сложной системе. Рассмотрим пример.
Персональный компьютер является сложной системой. Жесткий диск – составная часть этой системы. Другими ее частями являются центральный процессор, память и т. д. Можно сказать, что жесткий диск – это часть структурной иерархии под названием "персональный компьютер". С другой стороны, жесткий диск является абстракцией, обобщением свойств, присущих всем жестким дискам, и этим он отличается, например, от гибкого диска, рассматриваемого как абстракция, обобщающая свойства всех гибких дисков. В типовой иерархии жесткие диски Quantum – это особый тип жестких дисков, жесткие диски Quantum Fireball EL – особый тип жестких дисков Quantum, жесткие диски Quantum Fireball EL объемом 5.1 Гбайт – особый тип жестких дисков Quantum Fireball EL и т. д.
В данной аналогии абстрактный жесткий диск является базовым классом, жесткие диски фирмы Quantum образуют подкласс класса жестких дисков, жесткие диски Quantum Fireball EL – подкласс класса жестких дисков фирмы Quantum и т. д. Подкласс называют также производным классом или классом-потомком. Для него класс, расположенный выше в иерархии, является базовым, подклассом или родительским классом. В нашем примере объект (конкретный жесткий диск) является составной частью структуры под названием "персональный компьютер", и обладает своими свойствами в силу принадлежности к определенному типу дисков Quantum Fireball EL 5.1 Гбайт, отличающемуся по своим характеристикам от других типов жестких дисков.
Действие, которое можно выполнить над данными, определяет метод. Он представляет собой подпрограмму. Различают методы класса и методы объекта. Последние могут применяться к любому объекту класса. Методы класса, называемые также статическими методами, не зависят от отдельного экземпляра, они применяются к целому классу как к отдельному объекту.
Для создания объектов применяются специальные статические методы, называемые конструкторами.
Для корректного удаления объектов используются специальные методы, называемые деструкторами.
Термин наследование в ООП обозначает способность классов наследовать свойства и методы у своих родительских классов.
Термин полиморфизм в ООП обозначает свойство класса-потомка переопределять методы родительского класса.
Инкапсуляция, наследование, полиморфизм – базовые понятия, лежащие в основе объектно-ориентированного программирования. Объектно-ориентированный подход возник в результате непрекращающихся попыток человека преодолеть сложность окружающего мира, проявляющуюся в любых областях деятельности. Он предлагает более естественный способ разделения сложной задачи на ряд более простых, используя понятие объекта, сочетающего данные и действия над ними. Он также позволяет экономить усилия, связанные с написанием программного кода, так как однажды созданные методы не нужно переписывать – они просто наследуются производными классами. Идея повторного использования кода в своем развитии проходит ряд этапов: подпрограмма, библиотека, модуль, класс.
В этой главе мы рассмотрим, каким образом основные концепции объектно-ориентированного программирования реализованы в языке Perl.
В языке Perl нет специального синтаксиса для описания классов, объектов или методов. Для их реализации используются уже знакомые нам синтаксические конструкции. Класс в Perl представляет собой пакет, объект является ссылкой, а метод – обычной подпрограммой.