Основи спадкування.
Способи виявлення й видалення невідомого вірусу
Спроби протидії комп'ютерними вірусами
- Профілактика вірусного зараження й зменшення передбачуваної шкоди від такого зараження.
- Методика використання антивірусних програм, у тому числі знешкодження й видалення відомого вірусу.
Способи захисту комп'ютера від зараження вірусами, а отже й забезпечити надійне зберігання інформації на дисках:
- Установити на комп'ютері сучасні антивірусні програми й постійно оновлювати їх версії
- Перед зчитування інформації, записаної на інших комп'ютерах, завжди перевіряти носії на наявність вірусів ; перенесення на свій комп'ютер файли в архівіруваному вигляді перевіряти відразу після розархівування на жорстокому диску, обмежуючи ділянку перевірки тільки щойно записаними файлами ; періодично перевіряти на наявність вірусів жорсткі диски комп'ютера, запускаючи антивірусні програми для тестування файлів, пам'яті й системних ділянок
- Дистрибутивні копії програмного забезпечення необхідно купувати в офіційних продавців
- Періодично зберігати на зовнішньому носії файли, з якими ведеться робота
Один з основних механізмів об'єктно-орієнтованого програмування - спадкування - побудова нового класу на основі раніше описаного класу. Отримані в результаті спадкування класи опиняються класами-спадкоємцями (або дочірніми класами), а класи, на основі яких вони побудовані - класами-батьками (або батьківськими класами). При спадкуванні дочірній клас набуває всі властивості і методи батьківського класу і має доступ до будь-якого його елементу, за винятком описаних з областю видимості 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.