Конструктор, який приймає один аргумент. Задає перетворення типу свого аргументу в тип конструктора. Таке перетворення типу неявно застосовується тільки якщо воно унікальне.
Віртуальний конструктор
Конструктор не буває віртуальним в сенсі віртуального методу - для того, щоб механізм віртуальних методів працював, потрібно запустити конструктор, який автоматично налаштує таблицю віртуальних методів даного об'єкта.
«Віртуальними конструкторами» називають схожий, але інший механізм, присутній в деяких мовах - наприклад, він є в Delphi. але немає в C ++ і Java. Цей механізм дозволяє створити об'єкт будь-якого заздалегідь невідомого класу при двох умовах:
цей клас є нащадком якогось наперед заданого класу (в даному прикладі це клас TVehicle);
на всьому шляху успадкування від базового класу до створюваного ланцюжок перевизначення не обривати. При перевизначенні віртуального методу синтаксис Delphi вимагає ключове слово overload. щоб стара і нова функції з різними сигнатурами могли співіснувати, override для перевизначення функції або reintroduce для завдання нової функції з тим же ім'ям - Останнім неприпустимо.
Деструкція - спеціальний метод класу. службовець для деініціалізацііоб'екта (наприклад звільнення пам'яті).
Деструкція в Delphi
destructor Destroy; override;
У Delphi все класи є нащадками, по крайней мере, класу TObject, тому, для коректного звільнення пам'яті, необхідно перекривати деструктор, використовуючи директиву override.
У Delphi прямий виклик деструктора використовується рідко. Замість нього використовують метод Free.
Метод Free спочатку перевіряє чи існує знищуваний об'єкт, а потім викликає деструктор. Цей прийом дозволяє уникати помилок, що виникають при зверненні до неіснуючого об'єкту.
5.Використання розділів класу public, protected, published.
Якщо жоден із атрибутів не вказано, то за замовчуванням передбачається published. якщо клас компілюється з директивою; в іншому випадку такі компоненти мають атрибут public. Для більшої читабельності рекомендується групувати компоненти, які мають однакову видимість, розташовуючи їх в такому порядку: private. protected, public. published і automated. Опис класу тоді має наступний вигляд:
Компоненти private, protected і public.
Компоненти protected видимі всюди в тому модулі, де оголошений клас, і в будь-якому класі спадкоємця незалежно від того, в якому модулі описаний клас спадкоємець. Цей атрибут привласнюють тим компонентам, які хочуть зробити доступними тільки в класах нащадках.
· Покажчики на методи;
· Безліч з числом елементів до 32 (порядкові значення 0-31);
· Будь-який дійсний тип, крім Real48.
При додаванні компонентів на форму Delphi поміщає їх в секцію published (цей атрибут видимості застосовується за умовчанням).
Num. integer; Визиваетошібкукомпіляціі: Published field 'Num' not a class nor interface type.Поле такого типу треба описувати в іншій секції>
До питання про перекриття описів в похідних класах.
Якщо в деякому модулі описати, наприклад, об'єкт типу TControl, то захищені компоненти цього об'єкта будуть недоступні, що природно. Якщо тепер описати в цьому ж модулі клас, похідний від TControl, то ці (захищені) компоненти стануть доступні, наприклад:
TMyControl = class (TControl)
Відзначимо, що доступними стають все компоненти: поля, методи і властивості.
Чому так виходить? Очевидно, тому, що в тому модулі, де клас описаний, все його власні компоненти і успадковані (в тому числі і private) є доступними. Якщо ж опис класу TMyControl і об'єкта цього класу знаходяться в різних модулях, то специфікатор доступу починають працювати так, як їм і належить. В цьому випадку розширити зону видимості компонент-властивостей можна тільки за рахунок їх повторного опису як загальнодоступних, наприклад:
TMyControl = class (TControl)
Компоненти автоматизації (automated members).
Видимість цих компонент така ж, як і загальнодоступних. Відмінність полягає в тому, що для автоматичних компонент генерується інформація типу автоматизації (Automation type information), яка потрібна для серверів автоматизації. Компоненти автоматизації з'являються зазвичай тільки в класах, похідних від класу TAutoObject, оголошеного в модулі OleAuto. Цей клас, як і саме слово automated, призначені тільки для зворотної сумісності. Клас TAutoObject модуля ComObj не використовує слово automated. На компоненти автоматизації накладається цілий ряд обмежень, на яких ми тут зупинятися не будемо.
Випереджаючі опису і взаємно-залежні класи (Forward declarations and mutually dependent classes).
Якщо опис класу закінчується словом class і символом ";" (Крапка з комою), тобто воно має форму
type className = class;
без вказівки батьківського класу або списку компонентів, то це і є випереджаюче опис класу.
Визначальне опис цього ж класу має бути зроблено в тому ж розділі опису типу, що і випереджальне опис. Іншими словами, між випереджаючим і визначальним описом класу не може перебувати нічого, крім опису інших типів.
Випереджаючий опис дозволяє описати взаємно-залежні класи, Наведемо приклад:
TFigure = class; // Випереджаючий опис
TFigure = class // Визначальне опис
Не плутайте випереджаючий опис класу з визначальним описом класу, який є похідним класом від TObject, але для якої не зазначений батьківський клас або вказаний клас TObject:
TFirstClass = class; // Випереджаючий опис
TSecondClass = class // Визначальне опис
TThirdClass = class (TObject); // Визначальне опис