Ця стаття не містить . (січень 2023) |
В об'єктно-орієнтованому програмуванні абстрактний клас – це базовий клас, від якого не можна створити екземпляру. На практиці абстрактні класи реалізують один з принципів ООП – поліморфізм. В абстрактному класі можна описати (або не визначити) абстрактні методи та властивості. Абстрактний метод не реалізовується в класі в якому описується, але має бути реалізований в неабстрактному нащадку. Абстрактні класи вважаються найбільшими узагальненими абстракціями, тобто відношення об'єму описів до об'єму реалізації найбільше. В деяких мовах заборонено створювати екземпляри абстрактних класів, в інших дозволяється (наприклад, Delphi), але звернення даного екземпляра, до абстрактного методу викличе помилку. В багатьох мовах дозволяється оголошувати будь-який клас абстрактним навіть, якщо в ньому нема абстрактних методів (наприклад, Java). Для того щоб заборонити створення екземплярів. Абстрактний клас можна розглядати, як інтерфейс для сімейства класів, які ним породжені, але на противагу класичному інтерфейсу, абстрактний клас може містити реалізацію методів та властивості. Абстрактні методи переважно є і віртуальними, через це поняття «абстрактний» та «віртуальний» інколи плутають.
Використання абстрактних класів
Абстрактні класи відіграють важливу роль для статичної типізації в об’єктно-орієнтованих мовах. Багато динамічно типізованих мов не мають схожих механізмів (хоча використання відкидає потребу в абстрактних класах); а ще , реалізацію яких можна знайти в сучасних динамічно типізованих мовах. Деякі програмісти стверджують, що класи повинні бути фінальними (без похідних), або абстрактним.
Абстрактні класи корисні тим, що за їхньою допомогою можна визначити протокол; набір операцій, які мають бути у всіх об'єктах, які реалізують протокол.
Приклад
abstract class Demo { // Абстрактний клас може включати абстрактні методи без імплементації. abstract public int sum(int x, int y); // Абстрактний клас також включає конкретні методи public int product(int x, int y) { return x*y; } } interface DemoInterface { // Всі методи абстрактні. int getLength(); }
Delphi
В Delphi можна оголосити абстрактний клас з абстрактними методами.
TAbstractClass = class procedure NonAbstractProcedure; procedure AbstractProcedure; abstract; end;
Від цього класу можна створити екземпляр, але звернення до методу AbstractProcedure даного об'єкту, виведе помилку. В останніх версіях Delphi реалізовано можливість оголошувати сам клас як абстрактний:
TAbstractClass = class abstract procedure SomeProcedure; end;
Хоч метод SomeProcedure може бути реалізований (не абстрактним) в межах даного класу, але створювати екземпляри таких класів заборонено.
C++
Щоб в клас вважався абстрактним у ньому має бути описана щонайменше одна чиста віртуальна функція (це така функція яка не реалізована в даному класі), вигляду virtual __сигнатура методу__ = 0; Яка так як і інші може бути визначена в класах-нащадках. Приклад на мові програмування C++:
#include <iostream> class CA { // Абстрактний клас public: CA ( void ) { std::cout << "Це об'єкт класу "; } virtual void Abstr ( void ) = 0; void fun ( void ) { std::cout << "Реалізація не буде наслідуватися!"; } ~CA () { std::cout << "." << std::endl; } }; class CB : public CA { public: CB ( void ) { std::cout << "CB;"; } void Abstr ( void ){ std::cout << " виклик функції cb.Abstr();"; } void fun ( void ){ std::cout << " виклик функції cb.fun()"; } ~CB () {} }; class CC : public CA { public: CC ( void ) { std::cout << "CC;"; } void Abstr ( void ) { std::cout << " виклик функції cc.Abstr();"; } void fun ( void ) { std::cout << " виклик функції cc.fun()"; } ~CC () {} }; int main () { std::cout << "Program:" << std::endl; CB cb; cb.Abstr(); cb.fun(); cb.~CB(); CC cc; cc.Abstr(); cc.fun(); cc.~CC(); return 0; }
Результат роботи програми:
Program: Це об'єкт класу CB; виклик функції cb.Abstr(); виклик функції cb.fun(). Це об'єкт класу CC; виклик функції cc.Abstr(); виклик функції cc.fun(). . .
C#
Модифікатор abstract вказує на те, що даний клас можна використовувати тільки як базовий клас для наслідування. Абстрактний клас може містити абстрактні методи та методи доступу. Створювати екземпляр абстрактного класу заборонено через виклик конструктора, але екземпляр абстрактного класу створюється неявно при створені похідного класу від даного абстрактного класу. Неабстрактний клас, який похідний від абстрактного, має містити реальні реалізації всіх абстрактних методів та методів доступу. Щоб вказати про відсутність реалізації метода чи властивості використовуйте модифікатор abstract при їх оголошені. Абстрактний метод – це неявний віртуальний метод. Тільки в абстрактних класах та інтерфейсах (стереотипах, які аналогічні чистим абстрактним класам, в яких відсутня будь-яка реалізація) допускається оголошення абстрактних членів (методів, властивостей, подій). Оскільки оголошення абстрактних методів не надають фактичної реалізації, тіло метода відсутнє, оголошення метода просто завершується крапкою з комою, аналогічно оголошенню прототипів:
public abstract void AbstractMethod();
Реалізація методу створюється шляхом перевизначення override, в неабстрактному класі. Заборонено використовувати статичні чи віртуальні модифікатори при оголошені абстрактних методів або властивостей. Оголошення та реалізація абстрактних властивостей не сильно відрізняються від абстрактних методів, присутні тільки незначні синтаксичні розбіжності в оголошенні і викликах. Абстрактне наслідування властивостей може бути визначені в похідному класі за рахунок включення оголошення властивості з модифікатором перевизначення.
abstract class BaseClass { protected int _x = 100; protected int _y = 150; public abstract void AbstractMethod(); public abstract int X { get; } public abstract int Y { get; } } class DerivedClass : BaseClass { public override void AbstractMethod() { _x++; _y++; } public override int X { get { return _x + 10; } } public override int Y { get { return _y + 10; } } static void Main() { DerivedClass o = new DerivedClass(); o.AbstractMethod(); Console.WriteLine("x = {0}, y = {1}", o.X, o.Y); } } // Output: x = 111, y = 161
В абстрактному класі мають бути реалізовані всі члени інтерфейсу. Абстрактний клас, який реалізує інтерфейс, може представляти методи інтерфейсу, як абстрактні методи.
interface I { void M(); } abstract class C : I { public abstract void M(); }
Абстрактний клас з модифікатор sealed змінювати не можна, оскільки ці два модифікатори мають суперечливі властивості. Модифікатор sealed забороняє наслідування, а abstract обов'язково має мати похідний клас.
Див. також
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno sichen 2023 V ob yektno oriyentovanomu programuvanni abstraktnij klas ce bazovij klas vid yakogo ne mozhna stvoriti ekzemplyaru Na praktici abstraktni klasi realizuyut odin z principiv OOP polimorfizm V abstraktnomu klasi mozhna opisati abo ne viznachiti abstraktni metodi ta vlastivosti Abstraktnij metod ne realizovuyetsya v klasi v yakomu opisuyetsya ale maye buti realizovanij v neabstraktnomu nashadku Abstraktni klasi vvazhayutsya najbilshimi uzagalnenimi abstrakciyami tobto vidnoshennya ob yemu opisiv do ob yemu realizaciyi najbilshe V deyakih movah zaboroneno stvoryuvati ekzemplyari abstraktnih klasiv v inshih dozvolyayetsya napriklad Delphi ale zvernennya danogo ekzemplyara do abstraktnogo metodu vikliche pomilku V bagatoh movah dozvolyayetsya ogoloshuvati bud yakij klas abstraktnim navit yaksho v nomu nema abstraktnih metodiv napriklad Java Dlya togo shob zaboroniti stvorennya ekzemplyariv Abstraktnij klas mozhna rozglyadati yak interfejs dlya simejstva klasiv yaki nim porodzheni ale na protivagu klasichnomu interfejsu abstraktnij klas mozhe mistiti realizaciyu metodiv ta vlastivosti Abstraktni metodi perevazhno ye i virtualnimi cherez ce ponyattya abstraktnij ta virtualnij inkoli plutayut Vikoristannya abstraktnih klasivAbstraktni klasi vidigrayut vazhlivu rol dlya statichnoyi tipizaciyi v ob yektno oriyentovanih movah Bagato dinamichno tipizovanih mov ne mayut shozhih mehanizmiv hocha vikoristannya vidkidaye potrebu v abstraktnih klasah a she realizaciyu yakih mozhna znajti v suchasnih dinamichno tipizovanih movah Deyaki programisti stverdzhuyut sho klasi povinni buti finalnimi bez pohidnih abo abstraktnim Abstraktni klasi korisni tim sho za yihnoyu dopomogoyu mozhna viznachiti protokol nabir operacij yaki mayut buti u vsih ob yektah yaki realizuyut protokol PrikladJava abstract class Demo Abstraktnij klas mozhe vklyuchati abstraktni metodi bez implementaciyi abstract public int sum int x int y Abstraktnij klas takozh vklyuchaye konkretni metodi public int product int x int y return x y interface DemoInterface Vsi metodi abstraktni int getLength Delphi V Delphi mozhna ogolositi abstraktnij klas z abstraktnimi metodami TAbstractClass class procedure NonAbstractProcedure procedure AbstractProcedure abstract end Vid cogo klasu mozhna stvoriti ekzemplyar ale zvernennya do metodu AbstractProcedure danogo ob yektu vivede pomilku V ostannih versiyah Delphi realizovano mozhlivist ogoloshuvati sam klas yak abstraktnij TAbstractClass class abstract procedure SomeProcedure end Hoch metod SomeProcedure mozhe buti realizovanij ne abstraktnim v mezhah danogo klasu ale stvoryuvati ekzemplyari takih klasiv zaboroneno C Shob v C klas vvazhavsya abstraktnim u nomu maye buti opisana shonajmenshe odna chista virtualna funkciya ce taka funkciya yaka ne realizovana v danomu klasi viglyadu virtual signatura metodu 0 Yaka tak yak i inshi mozhe buti viznachena v klasah nashadkah Priklad na movi programuvannya C include lt iostream gt class CA Abstraktnij klas public CA void std cout lt lt Ce ob yekt klasu virtual void Abstr void 0 void fun void std cout lt lt Realizaciya ne bude nasliduvatisya CA std cout lt lt lt lt std endl class CB public CA public CB void std cout lt lt CB void Abstr void std cout lt lt viklik funkciyi cb Abstr void fun void std cout lt lt viklik funkciyi cb fun CB class CC public CA public CC void std cout lt lt CC void Abstr void std cout lt lt viklik funkciyi cc Abstr void fun void std cout lt lt viklik funkciyi cc fun CC int main std cout lt lt Program lt lt std endl CB cb cb Abstr cb fun cb CB CC cc cc Abstr cc fun cc CC return 0 Rezultat roboti programi Program Ce ob yekt klasu CB viklik funkciyi cb Abstr viklik funkciyi cb fun Ce ob yekt klasu CC viklik funkciyi cc Abstr viklik funkciyi cc fun C Modifikator abstract vkazuye na te sho danij klas mozhna vikoristovuvati tilki yak bazovij klas dlya nasliduvannya Abstraktnij klas mozhe mistiti abstraktni metodi ta metodi dostupu Stvoryuvati ekzemplyar abstraktnogo klasu zaboroneno cherez viklik konstruktora ale ekzemplyar abstraktnogo klasu stvoryuyetsya neyavno pri stvoreni pohidnogo klasu vid danogo abstraktnogo klasu Neabstraktnij klas yakij pohidnij vid abstraktnogo maye mistiti realni realizaciyi vsih abstraktnih metodiv ta metodiv dostupu Shob vkazati pro vidsutnist realizaciyi metoda chi vlastivosti vikoristovujte modifikator abstract pri yih ogolosheni Abstraktnij metod ce neyavnij virtualnij metod Tilki v abstraktnih klasah ta interfejsah stereotipah yaki analogichni chistim abstraktnim klasam v yakih vidsutnya bud yaka realizaciya dopuskayetsya ogoloshennya abstraktnih chleniv metodiv vlastivostej podij Oskilki ogoloshennya abstraktnih metodiv ne nadayut faktichnoyi realizaciyi tilo metoda vidsutnye ogoloshennya metoda prosto zavershuyetsya krapkoyu z komoyu analogichno ogoloshennyu prototipiv public abstract void AbstractMethod Realizaciya metodu stvoryuyetsya shlyahom pereviznachennya override v neabstraktnomu klasi Zaboroneno vikoristovuvati statichni chi virtualni modifikatori pri ogolosheni abstraktnih metodiv abo vlastivostej Ogoloshennya ta realizaciya abstraktnih vlastivostej ne silno vidriznyayutsya vid abstraktnih metodiv prisutni tilki neznachni sintaksichni rozbizhnosti v ogoloshenni i viklikah Abstraktne nasliduvannya vlastivostej mozhe buti viznacheni v pohidnomu klasi za rahunok vklyuchennya ogoloshennya vlastivosti z modifikatorom pereviznachennya abstract class BaseClass protected int x 100 protected int y 150 public abstract void AbstractMethod public abstract int X get public abstract int Y get class DerivedClass BaseClass public override void AbstractMethod x y public override int X get return x 10 public override int Y get return y 10 static void Main DerivedClass o new DerivedClass o AbstractMethod Console WriteLine x 0 y 1 o X o Y Output x 111 y 161 V abstraktnomu klasi mayut buti realizovani vsi chleni interfejsu Abstraktnij klas yakij realizuye interfejs mozhe predstavlyati metodi interfejsu yak abstraktni metodi interface I void M abstract class C I public abstract void M Abstraktnij klas z modifikator sealed zminyuvati ne mozhna oskilki ci dva modifikatori mayut superechlivi vlastivosti Modifikator sealed zaboronyaye nasliduvannya a abstract obov yazkovo maye mati pohidnij klas Div takozhOb yektno oriyentovane programuvannya Virtualnij metod Sistema tipizaciyi