• Киев1
     
    li
    СИСТЕМА ЗДОРОВЬЯ НАЦИИ
     
    li
     
     

     

     
     
     
  • Киев2
     
    li
    СИСТЕМА ЗДОРОВЬЯ НАЦИИ
     
    li
     
     

     

     
     
     
  • Киев3
     
    li
    СИСТЕМА ЗДОРОВЬЯ НАЦИИ
     
    li
     
     

     

     
     
     

Тема 2.2.41. Классы и объекты

План

1. Основные понятия
2. Составляющие класса
3. Объявление класса

1. Основные понятия

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

DelphiВыделить код
1
2
3
4
5
6
7
8
9
10
type TNewClass=Class(Tobject)
      Weight: Real;
      Height: Real;
      Age   : Integer;
     End;
Var Soldjer: TNewClass;
Begin
  Soldjer^.Weight:=88.6; //Неправильная форма записи
  Soldjer.Age   :=19;
End.

Класс – это особый пользовательский тип, служащий для упрощения разработки сложных программ и улучшения их качества. В основе классов лежат три фундаментальных принципа, которые называются инкапсуляция, наследование и полиморфизм. 
Класс представляет собой единство трех сущностей – полей, методов и свойств. Объединение этих сущностей в единое целое называется инкапсуляцией. Инкапсуляция позволяет во многом изолировать класс от остальных частей программы, сделать его автономным для решения конкретной задачи. В результате класс всегда несет в себе некоторую функциональность. Например, класс TForm содержит (инкапсулирует в себе) все необходимое для создания Windows-окна, класс TMemo представляет собой полнофункциональный текстовый редактор, класс TTimer обеспечивает работу программы с таймером и т. д. 
Инкапсуляция представляет собой мощное средство обмена готовыми к работе программными заготовками. Библиотека классов Delphi -это фактически набор готовых блоков, из кототых конструруется проект, по недоразумению продолжающий называться программой. 
Любой класс может быть порожден от другого класса. Для этого при его объявлении в скобках указывается имя класса-родителя: 
TKinder=class(TPapa);
Порожденный класс автоматически наследует поля, методы и свойства своего родителя и может добавлять свои. Таким образом, принцип наследования обеспечивает поэтапное создание сложных классов и разработку собственных библиотек классов. 
Все классы Object Pascal порождены от единственного родителя – класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения, обеспечивающие процесс существования всех объектов – от их создания до уничтожения. Программист не может создать класс, который не был бы дочерним классом TObject. Следующие два объявления эквивалентны: 

DelphiВыделить код
1
2
TNClass=class(TObject)
TNClass=class

Таким образом, по умолчанию непосредственным родилем любого пользовательского класса считается класс TObject.
Принцип наследования приводит к созданию ветвящегося дерева классов, постепенно разрастающегося при перемещении от TObject к его потомкам. Каждый потомок дополняет возможности своего родителя новыми и передает их своим потомкам. 
Полиморфизм – это свойство классов решать схожие по смыслу проблемы разными способами. В рамках Object Pascal поведенческие свойства класса определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках класса, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, т. е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов. 
В Object Pascal полиморфизм достигается не только описанным выше механизмом наследования и перекрытия методов родителя, но и их виртуализацией, позволяющей родительским методам обращаться к методам своих потомков. 

2. Составляющие класса

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

DelphiВыделить код
1
2
3
4
5
Type TNClass=class
      Age   :   Integer;
      Weight: Real;
      Moral : Tobject;
     End;

Каждый объект получает уникальный набор полей, но общий для всех объектов данного класса набор методов и свойств. Фундаментальный принцип инкапсуляции требует обращаться к полям только с помощью методов и свойств класса. Однако в Object Pascal разрешается обращаться к полям и напрямую: 

DelphiВыделить код
1
2
3
4
5
6
Var Soldjer: TNObject;
Begin
  . . . 
  Soldjer.Age:=20;
  . . .
End.

Класс-потомок получает все поля всех своих предков и может дополнять их своими, но он не может переопределять их или удалять. Таким образом, чем ниже в дереве иерархии располагается класс, тем больше данных получают в свое распоряжение его объекты. 
Инкапсулированные в классе процедуры и функции называются методами. Они обьявляются так же, как и обычные подпрограммы: 

DelphiВыделить код
1
2
3
4
5
6
Type TNClass=class
  Age   : Integer;
  Weight: Real;
  Function  Fire(Speed: Real):Integer;
  Procedure Running;
End;

Доступ к методам класса, как и к его полям, возможен с помощью составных имен:
Soldjer.Age:=Soldjer.Fire(27.9);
В состав любого класса входят два специальных метода – конструктор и деструктор. У класса TObject эти методы называются Create и Destroy, так же они называются в подавляющем большинстве его потомков. Конструктор распределяет объект в динамической памяти и помещает адрес этой памяти в переменную Self, которая автоматически объявляется в классе. Деструктор удаляет объект из кучи. Обращение к конструктору должно предварять любое обращение к полям и некоторым методам объекта. По своей форме конструкторы и деструкторы являются процедурами, но объявляются с помощью зарезервированных слов Constructor и Destructor: 

DelphiВыделить код
1
2
3
4
5
Type TNClass=class
  Age   : Integer;
  Constructor Create(Value: Integer);
  Destructor  Destroy;
End;

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

DelphiВыделить код
1
2
3
4
5
6
7
Var Soldjer: TNClass;
Begin
  Soldjer:=TNClass.Create;
  Soldjer.Age:=20;
  . . .
  Soldjer.Free;
End.

В базовом классе TObject определен метод Free, который сначала проверяет действительность адреса объекта и лишь затем вызывает деструктор Destroy. Обращение к деструктору объекта будет ошибочным, если объект предварительно не создан конструктором, поэтому для уничтожения ненужного объекта следует вызывать метод Free, как это сделано в предыдущем примере. 
Большинство конструкторов реализуют некоторые действия, необходимые для правильной работы объекта. Поэтому в конструкторе класса-потомка следует сначала вызвать конструктор своего родителя, а уже затем осуществлять дополнительные действия. Вызов любого метода родительского класса достигается с помощью зарезервированного слова Inherited (унаследованный): 

DelphiВыделить код
1
2
3
4
5
Constructor TNClass(Value: Integer);
Begin
  Inherited Create;
  Age:=Value;
End;

Некоторые методы могут вызываться без создания и инициации объекта. Такие методы называются методами класса, они объявляются с помощью зарезервированного слова class: 

DelphiВыделить код
1
2
3
4
5
6
7
8
Type TNClass=Class(TObject);
       class Function Alive: Boolean;
     End;
Var Flag: Boolean;
Begin
  Flag:=TNClass.Alive;
  . . . 
End;

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

DelphiВыделить код
1
2
3
4
5
6
Type TNClass=class
       Age: Integer;
       Function Alive:Boolean;
       Procedure Kill(Val: Boolean);
       Property Flag: Boolean read Alive write Kill;
     End;

В контексте программы свойство ведет себя как обычное поле. Разница между полем и свойством заключается в том, что при обращении к свойству автоматически подключается соответствующий метод: при передачи свойству нового значения – метод, описанный после write; если же свойство передает свое значение – метод read. Если нет необходимости в специальных действиях при чтении или записи свойства, вместо имени соответствующего метода можно указывать имя поля.Если необходимо, чтобы поле было доступно только для чтения или только для записи, следует опустить соответственно часть write или read. Вообще говоря, свойство может и не связываться с полем. Фактически оно описывает один или два метода, кото рые осуществляют некоторые действия над данными того же типа, что и свойство. 




3. Объявление класса

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

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


Защитный код
Обновить