Основи спадкування.

Способи виявлення й видалення невідомого вірусу

Спроби протидії комп'ютерними вірусами

- Профілактика вірусного зараження й зменшення передбачуваної шкоди від такого зараження.

- Методика використання антивірусних програм, у тому числі знешкодження й видалення відомого вірусу.

Способи захисту комп'ютера від зараження вірусами, а отже й забезпечити надійне зберігання інформації на дисках:

- Установити на комп'ютері сучасні антивірусні програми й постійно оновлювати їх версії

- Перед зчитування інформації, записаної на інших комп'ютерах, завжди перевіряти носії на наявність вірусів ; перенесення на свій комп'ютер файли в архівіруваному вигляді перевіряти відразу після розархівування на жорстокому диску, обмежуючи ділянку перевірки тільки щойно записаними файлами ; періодично перевіряти на наявність вірусів жорсткі диски комп'ютера, запускаючи антивірусні програми для тестування файлів, пам'яті й системних ділянок

- Дистрибутивні копії програмного забезпечення необхідно купувати в офіційних продавців

- Періодично зберігати на зовнішньому носії файли, з якими ведеться робота

 

 

Один з основних механізмів об'єктно-орієнтованого програмування - спадкування - побудова нового класу на основі раніше описаного класу. Отримані в результаті спадкування класи опиняються класами-спадкоємцями (або дочірніми класами), а класи, на основі яких вони побудовані - класами-батьками (або батьківськими класами). При спадкуванні дочірній клас набуває всі властивості і методи батьківського класу і має доступ до будь-якого його елементу, за винятком описаних з областю видимості private.

При описі дочірнього класу з використанням успадкування ім'я батьківського класу вказується в дужках після ключового слова сlass в заголовку інтерфейсної частини описуваного класу:

Туре

<Ім’я класу> = class (<Ім’я батьківського класу>) (Заголовок опису)

(Опис власних властивостей та методів)

End;

Клас-спадкоємець може бути описаний на основі будь-якого іншого класу, незалежно від того, чи є батьківський клас у свою чергу дочірнім. Більше того, всі класи в Delphi є спадкоємцями від класу TObject, навіть якщо це явно не указивается'3.

Клас TObject інкапсулює основні методи і властивості, пов'язані з загальною поведінкою об'єктів. До них відносяться такі як створення, ініціалізація і руйнування об'єктів; підтримка ідентифікації їх приналежності до класу під час виконання програми і багато іншого, пов'язані з інтеграцією об’єктів, створених в Delphi, в середовищі виконання програми, тоб-то операційну систему . Таким чином, примірники будь-якого класу в Delphi автоматично набувають всі ці можливості.

2. Перевизначення методів.

Часто трапляється ситуація, коли один або кілька методів дочірнього класу повинні працювати не так, як у батьківському класі. У якості прикладу можна навести клас TGeomFigure, який представляє собою абстрактну геометричну фігуру, і має метод Draw для її малювання. Спадкоємцями цього класу могли б бути класи ТСігсlе дія роботи з колами, TLine для роботи з лініями, і так далі.

Очевидно, що всі дочірні класи в такій ситуації повинні змінити метод Draw, щоб коректно відображати фігури, яким вони відповідають. Зміна функціональності успадкованих методів у дочірніх класах називається перевизначенням методів.

3. Механізм перевизначення

Для перевизначення методу, реалізованого в об'єкті-батькові, слід:

- вказати його заголовок у інтерфейсній частині опису дочірнього класу без зміни імені, списку параметрів і значення, що повертається (якщо метод є функцією);

- вказати після заголовка методу ключове слово override. Якщо ключове слово override не вказано, то метод не перевизначається.

- реалізувати метод (створити програмний код) в описовій частині об'єкта за звичайними правилами. При цьому в заголовку методу ключове слово override не вказується.

Щоб метод міг бути перевизначений в дочірніх класах, він повинен бути позначений ключовими словами virtual або dynamic в інтерфейсній частині класу-батька. Ключове слово virtual вказує на те, що метод повинен бути занесений у так звану таблицю віртуальних методів (ТВМ), а ключове слово dynamic не те, що метод повинен бути знайдений на ім'я в дереві батьківських об'єктів.

Різниця між використанням virtual і dynamic полягає в напрямку оптимізації компілятором викликів переобумовлених методів. Методи, помічені virtual, оптимізуються за швидкістю, а dynamic-методи за розміром програмного коду. У більшості випадків рекомендується використання віртуальних методів, а використання динамічних методів доцільно при високих ступенях вкладеності зв'язків батько-спадкоємець.

Наведемо опис класу Two Nums з двома властивостями а і b, і методом GetResalt, що повертає суму властивостей. Далі, від цього класу опишемо спадкоємця ThreeNums, що має вже три властивості - а, b і с, і переобумовленої метод Get Result таким чином, щоб повертати суму не двох, а трьох чисел (лістинг 3.1).

Лістинг 5.10. Використання перевизначення

 

 


4. Перевизначення методів із збереженням функціональності.

У наведеному прикладі метод GetResult класу Two'Nums повністю перевизначений в класі ThreeNums, тобто його початкова функціональність повністю загублена, але включена до функціональність заміщаючого методу за допомогою копіювання. Це практично завжди можливо, якщо розробник класу має доступ до вихідного тексту класу-батька, але не завжди зручно, оскільки програмний код, реалізуючий метод, може мати чималі розміри.

Для збереження функціональності перевизначеного методу в Delphi є можливість його виклику з переобумовленого методу за допомогою ключового слова Inherited, використовуваного наступним чином:

 

Inherited <назва методу> (<список параметрів>);

 

Аналогічно можуть викликатися і перевизначені методи, які є функціями:

 

... : = Inherited <назва методу> (<список параметрів>);

 

Змінимо попередній приклад таким чином, щоб сума властивостей в методі GetResult обчислювалася з використанням перевизначеного варіанта цього методу, описаного в класі TwoNums (лістинг 3.2).

Лістинг 3.2. Перевизначення методів із зберіганням функціональності

Unit Overriding2;

Interface

Type

TowNums = class

Public

a, b: Integer;

function GetResult: Integer; virtual;

End;

ThreeNums = class (TwoNums)

Public

c: Integer;

function TwoNums. GetResult: Integer; override;

End;

Implementation

Function TwoNums.GetResult: Integer;

Begin

Result :=a+b;

End;

Function ThreeNums.GetResult: Integer;

Begin

Result:=Inherited GetResult + c;

{результат функції – сума значення, що видається перевизначеним методом (сума a та b), та властивості с}

End;

End.