rpd000003160 (1012243), страница 6
Текст из файла (страница 6)
Основные концепции ООП.
ООП базируется на трех основных понятиях:
Инкапсуляция – объединение данных и методов обработки этих данных внутри единой структуры - класса. Понятие инкапсуляции также тесно связано с принципом сокрытия данных. Практически все объектно-ориентированные языки предоставляют возможность регулирования областей видимости данных. Таким образом программист может обеспечить возможность доступа к данным определенного класса только методам ограниченной группы классов, например методам только того класса, которому принадлежат данные. Кроме того программист может расширить область видимости данных и обеспечить доступ к ним, например, методам всех классов наследников того класса, которому принадлежат данные.
Наследование – возможность порождения новых классов-потомков от уже существующих классов-родителей. При этом потомок обладает всеми полями методами и свойствами своего родителя. Кроме того объекты потомки могут дополнять или модифицировать поля, методы и свойства своих родителей. Принцип наследования позволяет программисту создавать иерархию классов, наиболее полно отражающую особенности конкретной решаемой задачи, или рассматриваемой предметной области.
Все классы Object Pascal порождены от одного единственного класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы, обеспечивающие жизненный цикл любых объектов от создания до уничтожения, например, такие как выделение памяти при создании объекта и очистка памяти при уничтожении объекта.
Полиморфизм. Сущность полиморфизма заключается в том, что методы различных классов могут иметь одинаковые имена, но различное содержание. Это достигается переопределением родительского метода в классе потомке. В результате родитель и потомок будут реализовывать разное поведение, при этом обращение к одноименным методам для них осуществляется аналогичным образом.
Понятие класса. Синтаксис объявления класса. Поля и методы.
Класс в Object Pascal представляет собой новый структурный тип данных, определяемый программистом. Объявление класса осуществляется в секции объявления типом следующим образом:
type
TClassName = class (TParentName)//TParentName – имя родительского класса
end;
Поскольку, как говорилось ранее, все классы Object Pascal порождены от одного единственного класса TObject, следующие определения класса аналогичны:
type
TClassName = class
end;
type
TClassName = class (TObject)
end;
Составляющими класса являются поля и методы. Поля – это данные, которыми владеет класс. Полями классов могут быть данные любых типов, в том числе объекты других классов. Методы – это те действия, которые может выполнять класс со своими, либо другими доступными данными. Методы определяются внутри класса в виде процедур и функций.
В состав любого класса входят два специальных метода – конструктор и деструктор. По своей форме конструкторы и деструкторы являются обычными процедурами, однако объявляются с помощью специальных зарезервированных слов constructor и destructor.
У класса TObject определены конструктор и деструктор. Они называются соответственно Create и Destroy. Традиционно принято называть конструктор и деструктор именно этими именами, хотя это и не обязательно.
Конструктор распределяет объект в динамической памяти и помещает адрес этой памяти в переменную Self, которая автоматически объявляется в классе. Иными словами любой класс содержит поле Self (Его не надо объявлять), и значением этого поля у конкретного объекта является адрес динамической памяти, с которого начинается размещение этого объекта в памяти. Обращение к конструктору должно предварять любое обращение к полям и методам объекта. Это является следствием того, что переменная-объект является указателем, поэтому, не обратившись сначала к конструктору, и не выделив память под объект, компилятор не может определить, к какому участку памяти следует обращаться при обращении к полям и методам объекта.
Деструктор удаляет объект из кучи. Обращение к деструктору будет ошибочным, если объект предварительно не создан конструктором. В базовом классе TObject определен метод Free, который сначала проверяет действительность адреса объекта и лишь затем вызывает деструктор Destroy. Поэтому предпочтительным способом уничтожения объекта является вызов для него метода free.
type
TClassName = class
//поля класса
aField1:Boolean;
aField2:integer;
aField3:Srting;
//методы класса
Constructor Create(a,b:real);
Procedure MethodName1(c,d:byte);
Function MethodName2(e,f: real):real;
end;
Как и любой другой тип данных, класс служит лишь образцом для создания конкретных экземпляров переменных, которые называются объектами.
Объекты класса могут быть объявлены в любом модуле приложения, где доступно описание соответствующего класса так же, как и данные других типов, в секции объявления переменных.
…
var
Obj1 : TClassName;
…
Важным отличием класса от других типов данных является то, что объекты распределяются в куче. Поэтому переменная объект представляет собой лишь указатель на динамическую область памяти, т.е. содержит адрес, с которого начинается размещение объекта в памяти.
Каждый объект получает уникальный набор полей, но общий для всех объектов набор методов и свойств. Фундаментальный принцип инкапсуляции требует обращаться к полям класса только с помощью методов и свойств данного класса, однако, разрешается обращаться к полям напрямую.
…
Obj1.aField1 := true;
Obj1.aField2 := 5;
…
Необходимо отметить, что в Turbo Pascal’е понятиям класса и объекта в Delphi соответствовали соответственно понятие объекта и экземпляра объекта.
Object Pascal (Delphi) | Turbo Pascal |
Класс | Объект |
Объект | Экземпляр объекта |
Методы, объявленные в классе, могут вызываться различными способами, что зависит от вида метода. Вид метода определяется модификатором, который указывается в описании класса после заголовка метода и отделяется точкой с запятой. Некоторые модификаторы:
Overload - перегруженный
Virtual - виртуальный
Dynamic - динамический
Override - переопределяемый
Message – обработка сообщения
Abstract – абстрактный
Смысл и способы применения соответствующих модификаторов будет рассмотрен позднее по мере изучения различных особенностей реализации технологии ООП. Сейчас необходимо отметить лишь то, что по умолчанию все методы, объявленные в классе, являются статическими и вызываются как обычные подпрограммы.
Классовые методы – это особая категория процедур и функций, способных выполняться без создания экземпляра класса
Class procedure ProcedureName;
Классовые методы не должны обращаться к полям, так как в общем случае вызываются без создания объекта, и, следовательно, в момент вызова полей просто не существует. Классовые методы обычно используются для получения служебной информации о классе.
Операторы класса.
В Delphi предусмотрено 2 специализированных оператора, называемых операторами класса – is и as.
Оператор is предназначен для проверки принадлежности объекта к определенному классу.
…
If (Obj1 is TClassName) = true then
….
Ключевая особенность оператора is заключается в том, что он проверяет всю иерархическую цепочку наследования объекта в целом. И если класс является потомком некоторого другого хоть в десятом колене, то оператор is все равно вернет true.
Оператор as называется оператором приведения типа. Это достаточно мощный и опасный оператор, поэтому его применение должно быть максимально продуманным и внимательным.
With (Obj1 as TEdit) do
Оператор приведения типа явным образом указывает на то, что объект Obj1 должен действовать как объект класса TEdit. Соответственно, если программа попытается выполнить с объектом Obj1, не свойственные (недоступные) ему действия, это приведет к возникновению исключительной ситуации.
Безопасное использование приведения типов может быть реализовани следующим образом:
If Obj1 is TEdit then
With Obj1 as TEdit do Text := ‘некоторый текст’;
Это неявное приведение типа.
Явное приведение типа осуществляется с помощью конструкции
<Тип>(Объект)
TEdit(Obj1).Text := ‘некоторый текст’;
Версия: AAAAAARxf/E Код: 000003160