Шаг 74 - Свойства и методы - ООП в действии

Наверное, с момента создания первого компьютера программисты стремились сделать язык программирования этого самого компьютера более доступным, понятным и гибким. Следствием этого явилось большое число отличающихся и не очень языков. Первыми по настоящему процедурными языками были языки семества Алгол-60. В них впервые было введено понятие подпрограмм, четких алгоритмов и циклов. Однако мысль шла вперед, и сначала в языке Simula-67, а затем и в развившем их семействе языков SmallTalk появляется понятие абстрактного объектно-ориентированного программирования (ООП).

Кроме языка SmallTalk существовали многие другие языки, в частности такие, как Pascal и C. Несмотря на очень сильно отличающиеся в те времена семантику и философию, на данный момент эти два языка являются одними из самых распространенных. На первом месте, конечно, C :). Так вот, были попытки реализовать некоторые понятия SmallTalk в этих языках, что привело к созданию Object Pascal, Objective C и C++. И соответственно их реализации - Borland Delphi, Borland C++, GNU C++ (для UNIX систем), и MS Visual C++.

Так вот. В ООП предполагается следующая абстракция - используются не равноправные участки кода, процедуры, а абсолютно независимые объекты с собственным поведением, содержащие в себе и данные, и процедуры с необходимыми правами доступа. Это сходно с понятием struct или record, использовавшихся соответственно в Pascal и C. Фактически, свойство является данным, а метод - процедурой. Как пример объекта можно привести, например, машину. Она имеет свойства - цвет, мощность, количество цилиндров, и методы - педали газа и тормоза, коробку передач, руль, что позволяет управлять ей. При этом необходимо различать собственно объекты и классы. Класс является типом, а объект - действующим экземпляром класса.

Наверное, интересно знать, как это реализуется компиляторами? Одним из способов реализации ООП является следующее. Реально методы используемых классов компилируются как отдельные процедуры, а сами объекты записываются как структуры. При вызове метода класса ему неявно передается указатель this, указывающий как раз на конкретную структуру с данными объекта. По умолчанию компилятор сначала пытается найти переменную, входящую в описание класса, а затем уже - глобальные переменные. Для прямого доступа к глобальным переменным используется лексема ::. Надо сказать, что C++ не предоставляет достаточно удобную возможность обращения к конкретному классу оператором типа with, используемому в Паскале. Это не принципиально, но может существенно сократить размер печатаемого программистом кода.

Кроме того, объектно-ориентированное программирование предполагает разграничение областей видимости. То есть использование защищенных, скрытых и общедоступных методов. Это реализуется секциями protected, private, public соответственно. Подразумевается, что к защищенной области доступ имеют методы этого класса и производных от него. К скрытой (приватной) области доступ имеют только методы этого класса. К общедоступной области доступ имеют все.

Немного о наследовании. Наследование дает большие возможности развития классов, их взаимодействия и типизации. Чаще всего в C++ используется метод типизации типа public, например:

class TForm1 : public TForm
{
	/*.....*/
};

В этом случае область видимости остается прежней - защищенные методы защищенными, а публичные публичными. Впрочем, спецификатором доступа может быть и private. В этом случае область видимости сужается - защищенные и общедоступные методы становятся приватными.

Однако, C++ Builder несколько изменяет привычный образ ООП, внося в него свои коррективы. Неизвестно, насколько они оправданы, но без них VCL в ее теперешнем C++ виде не могла бы существовать. Об этих расширениях мы и поговорим в следующем шаге.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 28.05.2002