Мегаобучалка Главная | О нас | Обратная связь


Лабораторная работа 11. Классы



2020-02-04 199 Обсуждений (0)
Лабораторная работа 11. Классы 0.00 из 5.00 0 оценок




Цель: Научиться создавать простейшие программы на языке программирования Delphi.

Классами в Object Ра s са1 называются специальные типы, которые
содержат поля, методы и свойства. Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называются объектами. В предшественнике — Ти rb о Ра s с al объектами называются типы, имеющие много общего с классами Object Ра s са1. Однако существенные усовершенствования, внесенные в объектную модель Object Ра s са1, заставили разработчиков языка ввести для обозначения объектов специальный термин — класс, заимствованный из Си++. Для совместимости с ранее разработанными программами системы Turbo Ра s са1 7.0 в I Ра s са1 сохранен тип-объект Object , поддерживающий «старую» объектную модель. Поскольку все возможности этой модели доступны классам, «Освободившийся» термин объект будут употреблять исключительно для обозначения конкретного экземпляра реализации класса.

Важным отличием классов от других типов является то, что объекты класса всегда распределяются в динамической памяти, поэтому объект-переменная фактически представляет собой лишь указатель на динамическую область памяти. Однако в отличие от других указателей при ссылке на содержимое объекта запрещается использовать символ «^» за именем объекта.

Класс может содержать поля, методы и свойства. Понятие пóля и метода при описании класса полностью совпадают с данными понятиями, реализованными в описание объектов. Полями называются инкапсулированные в класс данные. Поля могут быть любого типа, в том числе классами. Инкапсулированные в классы процедуры и функции называются методами.

Более подробно остановимся на понятии свойства.

Свойство — это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных слов property, read и write (слова read и write считаются зарезервированными только в контексте объявления свойства). Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Например:

Type TaClass= class

IntField: Integer;

Function GetField: integer;

Procedure SetField (value: Integer);

Property IntegerValue: integer read GetField write SetField;

End;

В контексте программы свойство ведет себя как обычное поле. Например, можно написать такие операторы:

Var

aClass: TaClass;

Value: integer;

Begin

AClass:=TaClass.Create; {Обязательное обращение к конструктору

 перед обращением к полю или свойству!}

……….

aClass.IntegerValue:= 0;

……….

Value:= aClass.IntegerValue;

……….

 aClass .Destroy; {Удаление ненужного объекта }

……….

End.

Более того, возможен и такой оператор присваивания:

aClass.IntField:= NewValue;

Разница между этим оператором и оператором

AClass.IntegerValue:= NewValue;

заключается в том, что при обращении к свойству автоматически подключается метод SetField, в котором могут реализовываться специфические действия.

Если нет необходимости в специальных действиях при чтении и записи свойства, вместо имени соответствующего метода можно указывать имя поля:

Type TaClass= class

IntField:Intege;

Procedure SetField (value:Integer);

Property IntegerValue: integer read IntField write SetField;

End;

Свойство может и не связываться с полем. Фактически оно описывает один или два метода, которые осуществляют некоторые действия над данными того же типа, что и свойство.

Любой вновь созданный класс может иметь секции (разделы), определяемые зарезервированными словами published (декларированные), pri vate (личные), protected (защищенные), public (доступные) и automated (автоматизированные). Внутри каждой секции вначале описываются поля,
а затем методы и свойства.

Секции определяют области видимости элементов описанного класса. Секция public не накладывает ограничений на область видимости перечисленных в ней полей, методов и свойств — их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (т. е. в окне инспектора объектов). Секция published используется только при разработке нестандартных компонентов. Среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заголовком класса и продолжается до первой объявленной секции. Эта секция — published. Программисту не следует помещать в нее собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: личные элементы описания доступны только внутри методов данного класса и в подпрограммах, находящихся в том же модуле, где описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу OLE -объектов автоматизации; область видимости членов этой секции не ограничена.

Разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой.

Рассмотрим основополагающие абстрактные классы объектов Delphi. Имеется сложная структура иерархии классов, которые могут использоваться в программе, создавая объекты этих классов или формировать классы потомков. В начале этой иерархии стоят абстрактные классы, которые являются родоначальниками целых семейств классов.

Самая общая структура абстрактных классов имеет следующий вид:

 

 

Класс TObject является предком всех других классов, используемых
в Delphi. Класс TObject содержит конструктор Create, деструктор Done
и метод Free, которые проверяют наличие объекта, и если он существует, то вызывают деструктор.

Среди методов класса TObject можно отметить следующие: ClassName — функция, которая формирует строку, содержащую имя класса, заданное ему при создании (например TEdit, Tbutton, TForm и т. д.), ClassParent — строковая функция, применимая только к классам и определяющая класс непосредственного предка, InstanteSize — целочисленная функция, применимая только к классам и возвращающая размер класса или объекта
в байтах. ClassType — функция, возвращающая класс конкретного объекта. Для класса TObject определен метакласс TClass.

Пример 1

Для произвольного класса выдать все родительские классы и их размеры.

Поместим на форму два компонента Edit, в одном из которых будет выдаваться имя класса, а во втором — размер класса. Определим дополнительное поле class1 типа TClass, в котором будем хранить имя класса. Вся работа в программе сводится к двум процедурам обработки событий — это создание формы и нажатие на кнопку. При создании формы в переменной class1 будем записывать имя произвольного класса, а при нажатии кнопки будем в одном компоненте Edit выдавать имя класса в другой размер данного класса, а также определять класс непосредственного предка.

Тогда программа будет иметь вид:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, AxCtrls, OleCtrls, vcf1, MPlayer, StdCtrls;

type

 TForm1 = class(TForm)

 Edit1: TEdit;

 Button1: TButton;

 Edit2: TEdit;

 procedure Button1Click(Sender: TObject);

 procedure FormCreate(Sender: TObject);

 private

 { Private declarations }

 public

 class1:TClass; {описание поля - класс}

 { Public declarations }

 end;

var

 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

 Class1:=TButton; {задание произвольного класса}

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 Edit1.Text:=class1.ClassName; {определение имени класса}

 Edit2.Text:=IntToStr(class1.InstanceSize); {определение размера объекта класса}

class1:=class1.ClassParent; {определение непосредственного предка}

end;

end.

Класс TPersistent (постоянный) является потомком класса TObject
и предком всех классов, объекты которых могут быть помещены в память и взяты оттуда.

Класс TComponent является родоначальником всех компонентов, используемых в приложении. Класс TComponent содержит ряд свойств
и методов, обеспечивающих отношение объектов основной/вспомогатель-ный. Целочисленное ComponentCount определяет число вспомогательных компонентов текущего компонента. Это свойство доступно только для чтения и только во время выполнения программы и автоматически изменяет свое значение при добавлении вспомогательного компонента методом InsertComponent или удаления компонента методом RemoveComponent. Свойство ComponentIndex определяет положение компонента в списке вспомогательных компонентов основного компонента. Нумерация компонент начинается с 0.

Свойство Component[Index: Integer]типа TComponent задает список вспомогательных компонентов. Свойство Owner типа TComponent содержит указатель на основной компонент.

Пример 2

Получить имена и классы всех компонентов, расположенных на форме.

Поместим на форму четыре компонента Edit и один компонент Button. В разделе public формы опишем целочисленную переменную i, в которой будем хранить номер компонента. Начальное значение данной переменной будет задаваться при создании формы. При нажатии на кнопку в соответствующих компонентах Edin будем выдавать имя компонента, имя класса и порядковый номер. Тогда программа может иметь следующий вид:

procedure TForm1.FormCreate(Sender: TObject);

begin

 I:=0;

 Edit4.Text:=IntToStr(Form1.ComponentCount);

 end;

procedure TForm1.Button1Click(Sender: TObject);

begin

 If i<=Form1.ComponentCount-1 then

 begin

 Edit1.Text:=Form1.Components[i].Name;

 Edit2.Text:=Form1.Components[i].ClassName;

 Edit3.Text:=IntToStr(i);

 i:=i+1;

 end;

 end;

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

Класс TControl является родоначальником всех элементов управления, с помощью которых вводится информация на экран при помощи клавиатуры и мыши. Все компоненты управления могут отображаться на экране, а следовательно, они должны содержать свойства, в которых хранятся экранные координаты компонента (Left, Top, Height, Weight), свойства определяющие внешний вид и положение элемента на экране (Align, Color, Caption, Cursor, Fount, Visible, ...).

Класс TWinControl характеризуется наличием у объектов его семейства оконных функций, что приводит к возможности реакции такого элемента на внешнее воздействие. Класс имеет характеристики, позволяющие формировать изображение элементов управления в стиле Windows.

Класс TScrollingWinControl является предком всех прокручиваемых элементов управления. Дополнительно к наследуемым характеристикам он обладает средствами прокрутки изображения, если оно целиком
не умещается в окне.

Класс TGraphControl отличается тем, что у объектов его семейства отсутствуют оконные функции, в силу чего они не могут реагировать на внешние воздействия. В связи с этим такие элементы могут служить только для вывода на экран графической информации.

Правило Object Pascal о совместимости типов классов позволяет использовать класс-потомок там, где требуется класс-предок, но не наоборот.

Делая явное преобразование типов, мы можем вызвать очень неприятную ошибку времени выполнения (или, что еще хуже, незаметное изменение содержимого памяти), поскольку компилятор не может определить, является ли тип объекта корректным и существуют ли в действительности вызываемые методы.

Чтобы решить эту проблему, мы можем использовать технику, основанную на информации о типе времени выполнения (Run - time type information, RTTI). Суть состоит в том, что каждый объект «знает» свой тип, а также класс своего родителя. Мы можем обратиться к этой информации, используя оператор is или некоторые методы класса TObject. Параметрами оператора is являются объект и тип класса, а возвращаемое значение имеет тип Boolean. Например,

If Omyclass is TMyClass then

Выражение is принимает значение True, если OMyClass в данный момент ссылается на объект класса TMyClass или его потомка. Теперь, когда вы уверены, что переменная совместима с типом TMyClass, можно произвести безопасное приведение (преобразование) типов.

Такие же операции выполняются напрямую другим оператором RTTI, оператором as, который преобразует объект только в том случае, если тип запрашиваемого класса совместим с текущим. Параметрами оператора as являются объект и тип класса, а результатом является объект, приведенный к новому типу.

Разница между традиционным преобразованием типов и использованием оператора as заключается в том, что последний вызывает исключительную ситуацию (EInvalidCast), если тип объекта не совместим с типом класса, к которому вы пытаетесь его привести.

Задание:

1. Проверьте все программы из данной лабораторной работы.



2020-02-04 199 Обсуждений (0)
Лабораторная работа 11. Классы 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа 11. Классы

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (199)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)