русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Абстрактні класи


Дата додавання: 2015-01-08; переглядів: 943.


 

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

Абстрактний клас служить тільки для породження нащадків. Як правило, в ньому задається набір методів, які кожен з нащадків реалізовуватиме по-своєму. Абстрактні класи призначені для представлення загальних понять, які передбачається конкретизувати в похідних класах.

Абстрактний клас задає інтерфейс для всієї ієрархії, при цьому методам класу може не відповідати ніяких конкретних дій. В цьому випадку методи мають порожнє тіло і оголошуються зі специфікатором abstract.

Якщо в класі є хоч би один абстрактний метод, весь клас також має бути описаний як абстрактний. Приклад приведений на лістингу 8.4.

 

Лістинг 8.4. Абстрактний клас

using System;

 

namespace examp50

{

abstract class Spirit

{

public abstract void Passport();

}

 

class Monster : Spirit

{

public Monster()

{

this.name = "Noname";

this.health = 100;

this.ammo = 100;

}

 

public Monster(string name)

: this()

{

this.name = name;

}

public Monster(int health, int ammo, string name)

{

this.name = name;

this.health = health;

this.ammo = ammo;

}

public string GetName()

{

return name;

}

 

public int GetHealth()

{

return health;

}

 

public int GetAmmo()

{

return ammo;

}

override public void Passport()

{

Console.WriteLine("Monster {0} \t health = {1} ammo = {2}", name, health, ammo);

}

 

public string name; // закриті поля

public int health, ammo;

}

 

class Daemon : Monster

{

public Daemon()

{

brain = 1;

}

 

public Daemon(string name, int brain)

: base(name) // 1

{

this.brain = brain;

}

 

public Daemon(int health, int ammo, string name, int brain)

: base(health, ammo, name) // 2

{

this.brain = brain;

}

 

 

override public void Passport() // 3

{

Console.WriteLine(

"Daemon {0} \t health = {1} ammo = {2} brain = {3}",

name, health, ammo, brain);

}

 

int brain; // закрите поле

}

 

class Classl

{

static void Main()

{

Daemon Dim1 = new Daemon("Dima", 3);

Dim1.Passport();

 

Monster Dim2 = new Daemon("Dima", 8);

Dim2.Passport();

 

Monster Dim3 = new Monster();

Dim3.Passport();

 

}

}

}

 

Результат роботи програми:

Daemon Dima health = 100 ammo = 100 brain = 3

Daemon Dima health = 100 ammo = 100 brain = 8

Monster Noname health = 100 ammo = 100

 

Абстрактні класи використовуються при роботі із структурами даних, призначеними для зберігання об'єктів однієї ієрархії, і як параметри методів. Якщо клас, похідний від абстрактного, не перевизначає всі абстрактні методи, він також повинен описуватися як абстрактний.

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

 


<== попередня лекція | наступна лекція ==>
Віртуальні методи | Безплідні класи


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн