Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Спадкування

Припустимо, ми створюємо програму, у якій крім об'єкта-точки, фігурує, також об'єкт-коло. Звичайно, можна було б опис цього нового типу створити з нуля, подібно тому, як ми описали тип Dot у попередньому розділі. Однак цей новий тип коло (назвемо його Ring) має багато загального з існуючим типом Dot. Насправді, як і точка, коло характеризується двома координатами: А и В, що визначають положення її центра. Однак для створюваного об'єкта необхідно додати поле, що задає радіус кола.

Що стосується методів, то для нового типу Ring підійшов би метод Move, оскільки переміщення точки і переміщення кола (власне, її центра) по екрану здійснюється однаково. Однак метод, що ініціалізує об'єкт (Init), а також методи, що роблять коло видимим чи невидимим (Show і Hide), прийдеться створити нові.

Отже, ми з'ясували, що новий тип Rіng де в чому повторює тип Dot. А чи не можна новий тип створити на основі вже існуючого, просто додавши в нього нові поля і методи? Виявляється, це можливо завдяки властивості об'єктних типів, відомому як спадкування. Оскільки мова йде про спадкування, відповідно до генеалогічної термінології існуючий тип, що є основою для створення нового об'єкта, називають предком, чи батьківським типом, а створюваний об'єкт:нащадком, чи дочірнім типом. Нащадок автоматично успадковує всі поля і методи свого предка.

Властивість спадкування широко використовується в об’єктно-орієнтованому програмуванні. Завдяки йому на основі існуючого об'єкта можна створити будь-яку кількість нових об'єктів. Ґрунтуючись на цих нових об'єктах, можна створювати ще об'єкти — і т.д., причому довжина ланцюжка спадкування нічим не обмежується. При цьому кожен об'єкт може мати будь-яку кількість нащадків, але тільки єдиного предка.

А тепер повернемося до наших типів Dot і Ring. B описі типу-нащадка повинний вказуватися ім'я батьківського типу (у круглих дужках після зарезервованого слова OBJECT):

type Ring = object (Dot)

Rad : integer; end;

У приведеному описі типу Ring мається поле Rad, яке визначає радіус кола, якого не було в типу Dot. Крім того, тип Ring успадкував усі поля свого предка (два значення типу INTEGER, що визначають положення точки на екрані). Однак тут поки відсутні методи. От як може виглядати опис типу Ring, доповнене відповідними методами:

Ring = object (Dot)

Rad : integer

procedure Init (x, у, r : integer)

procedure Show;

procedure Hide;

end;

procedure Ring.Init; begin

a:=x; b:=y; Rad:=r; end;

procedure Ring.Show; begin

SetColor(White);

Circle(a,b,Rad); end;

procedure Ring.Hide; begin

SetColor(Black);

Circle(a,b,Rad); end;

end;

Необхідно помітити, що методи об'єкта-нащадка заміняють собою (чи перевизначають) для нащадка однойменні методи батьківського об'єкта. Іншими словами, якщо має місце звертання до методу Rіng.Move, система дивиться, чи не заданий метод з таким ім'ям в описі об'єкта Rіng. Якщо так, використовується цей новий метод; якщо ні, використовується метод, успадкований від предка. (При цьому необхідно пам'ятати, що перевизначати можна тільки методи, імена полів в об'єкті-нащадку не повинні збігатися з іменами полів батьківського об'єкта.).

Після того як тип-нащадок оголошен, перш ніж приступити до маніпулювання його полями, необхідно створити екземпляр об'єкта:

var ring1:ring;