Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Основи Програмування C_.doc
Скачиваний:
46
Добавлен:
18.12.2018
Размер:
1.44 Mб
Скачать

Спадкування в мові с#.

1. Поняття про спадкування та ієрархію класів.

Одним із трьох основних принципів об’єктно-орієнтованого програмування є спадкування, яке забезпечує можливість повторного використання існуючих класів. Мова C# надає можливості створювати нові класи, що є різновидами вже існуючих класів. Такий клас містить у собі всі члени так званого базового або батьківського класу, додаючи у нього особливості власного функціонування. Клас, який створюється на основі базового, називається похідним або дочірнім класом (інколи говорять: класом-нащадком). Це так зване класичне спадкування, яке встановлює між похідним та базовим класом відношення «Є»: похідний клас є різновидом базового. Зрозуміло, що і похідний клас може стати базовим при створенні наступного похідного класу від нього. Все гроно класів, які мають спільний корінь, разом із зв’язками між ними, називається ієрархією класів. Співвідношення між базовим та похідним класом позначається діаграмою, наведеною на малюнку.

Визначення похідного класу має наступний синтаксис:

class <ідентифікатор базового класу>

{

// код базового класу

}

class <ідентифікатор похідного класу> : <ідентифікатор базового класу>

{

// код похідного класу

}

Наведемо приклад створення похідного класу. Базовий клас Building буде визначати деяку будівлю. Оскільки офісний будинок та житловий будинки є різновидами будівлі, для них можна визначити похідні класи OfficeBuilding та LivingBuilding, додавши у клас Building необхідну функціональність.

namespace DerivativeClass

{

class Building

{ // базовий клас - будинок

public int floors; // кількість поверхів

public double area; // площа

}

class OfficeBuilding : Building

{ // похідний клас - офісний будинок

public int numOffices; // кількість офісів

}

class LivingBuilding : Building

{ // ще один похідний клас - житловий будинок

public int numFlats; // кількість квартир

public int numPeople; // кількість жителів

}

class Program

{

static void Main()

{

Building b = new Building(); // створюємо будинок

b.area = 1000; // визначаємо площу

b.floors = 10; // визначаємо кількість поверхів

// створюємо офісний будинок

OfficeBuilding ob = new OfficeBuilding();

ob.area = 500; // визначаємо площу

ob.floors = 3; // визначаємо кількість поверхів

ob.numOffices = 8; // визначаємо кількість офісів

// створюємо житловий будинок

LivingBuilding lb = new LivingBuilding();

lb.area = 2000; // визначаємо площу

lb.floors = 5; // визначаємо кількість поверхів

lb.numFlats = 20; // визначаємо кількість квартир

lb.numPeople = 75; // визначаємо кількість мешканців

Console.WriteLine(

"Будинок : поверхiв {0} площа {1}", b.floors, b.area);

Console.WriteLine(

"Офiсний будинок : поверхiв {0} площа {1} офiсiв {2}",

ob.floors, ob.area, ob.numOffices);

Console.WriteLine(

"Житловий будинок : поверхiв {0} площа {1} квартир {2}

мешканцiв {3}", lb.floors, lb.area, lb.numFlats,

lb.numPeople);

}

}

}

Як видно з даного прикладу, об’єкти класів OfficeBuilding та LivingBuilding крім власних членів мають і всі члени базового класу Building. Хоча в даному прикладі розглядались лише дані-члени, все сказане переноситься і на інші члени класів – методи, властивості, індексатори. Правда, такий спосіб спадкування має місце лише у випадку, коли члени базового класу відкриті – public.

Зауваження.

  1. Правила спадкування мови С# забороняють використовувати два або більше класів як базові – множинне спадкування, подібне до існуючого в С++, мова С# не підтримує.

  2. Якщо при визначенні класу не вказано базовий клас, то компілятор вважає, що базовим класом є System.Object. Тобто наступні два визначення класів еквівалентні :

class MyClass : Object // клас успадкований від System.Object

{

// визначення класу

}

та

class MyClass // клас успадкований від System.Object

{

// визначення класу

}

Таким чином, всі створені класи успадковують методи від класу System.Object.

  1. Якщо при визначенні класу вказано службове слово sealed, це означає заборону спадкування від такого класу, тобто наступний класс не може бути використаний як базовий:

// від цього класу не можна утворити похідний клас

sealed class MyClass

{

// визначення класу

}