Абстрактен клас срещу интерфейс
 

Абстрактен клас и интерфейс са две обектно-ориентирани конструкции, открити в много обектно-ориентирани езици за програмиране като Java. Абстрактният клас може да се разглежда като абстрактна версия на обикновен (конкретен) клас, докато интерфейсът може да се разглежда като средство за изпълнение на договор. Абстрактният клас е клас, който не може да бъде инициализиран, но може да бъде разширен. Интерфейсът е тип, който трябва да бъде реализиран от други класове. В Java класовете "Абстракт" се декларират с помощта на ключовата дума "Абстракт", докато ключовата дума за интерфейс се използва за определяне на интерфейс.

Какво е абстрактна класа?

Обикновено абстрактните класове, известни също като абстрактни базови класове (ABC), не могат да бъдат създадени (екземпляр от този клас не може да бъде създаден). Така че абстрактните класове имат смисъл да имат само ако езикът на програмиране поддържа наследяване (способност за създаване на подкласове от разширяване на клас). Абстрактните класове обикновено представляват абстрактно понятие или образувание с частично или без прилагане. Следователно абстрактните класове действат като родителски класове, от които се извеждат детски класове, така че класът деца ще споделя непълните характеристики на родителския клас и може да се добави функционалност за завършването им.

Абстрактните класове могат да съдържат абстрактни методи. Подкласовете, разширяващи абстрактен клас, могат да реализират тези (наследени) абстрактни методи. Ако детският клас прилага всички такива абстрактни методи, това е конкретен клас. Но ако това не стане, класът на децата също се превръща в абстрактен клас. Всичко това означава, че когато програмистът определи клас като абстракт, тя казва, че класът ще бъде непълен и ще има елементи, които трябва да бъдат попълнени от наследяващите подкласове. Това е хубав начин за създаване на договор между двама програмисти, който опростява задачите в разработката на софтуер. Програмистът, който пише код за наследяване, трябва точно да следва определенията на метода (но разбира се, може да има собствена реализация).

Какво е интерфейс?

Интерфейсът е абстрактен тип, който се използва за определяне на договор, който трябва да бъде изпълнен от класове, които прилагат този интерфейс. Интерфейсната ключова дума се използва за дефиниране на интерфейс, а ключовата дума Implements се използва за внедряване на интерфейс от клас (на езика за програмиране на Java). Обикновено интерфейсът ще съдържа само подписи на методи и постоянни декларации. Всеки интерфейс, който реализира определен интерфейс, трябва да реализира всички методи, дефинирани в интерфейса, или трябва да бъде деклариран като абстрактен клас. В Java типът на референтен обект може да бъде определен като тип интерфейс. Но този обект трябва или да е нулев, или трябва да съдържа обект от клас, който реализира този конкретен интерфейс. Използвайки ключовата дума Implements в Java, можете да внедрите множество интерфейси в един клас.

Каква е разликата между абстрактния клас и интерфейса?

Абстрактните класове обикновено представляват абстрактна концепция или образувание с частично или никакво изпълнение. От друга страна, интерфейсът е абстрактен тип, който се използва за определяне на договор, който трябва да бъде изпълнен от класове. Абстрактните класове трябва да бъдат наследени (или разширени), докато интерфейсите трябва да бъдат внедрени. Абстрактните класове могат да съдържат абстрактни методи, докато интерфейсът трябва да съдържа само абстрактни методи. Абстрактните класове могат да съдържат всякакви променливи, но интерфейсите могат да определят само константи. Класът не може да наследи от повече от един абстрактен клас, но може да реализира множество интерфейси. Интерфейсът не може да реализира друг интерфейс. Интерфейсът обаче може да разшири клас.