Абстрактен клас срещу интерфейс
Абстрактният клас и интерфейсът са две обектно-ориентирани конструкции, открити в много обектно-ориентирани езици за програмиране като Java. Абстрактният клас може да се разглежда като абстрактна версия на обикновен (конкретен) клас, докато интерфейсът може да се разглежда като средство за изпълнение на договор. Абстрактният клас е клас, който не може да бъде инициализиран, но може да бъде разширен. Интерфейсът е тип, който трябва да бъде имплементиран от други класове. В Java абстрактните класове се декларират с помощта на ключова дума Abstract, докато ключовата дума interface се използва за дефиниране на интерфейс.
Какво е абстрактен клас?
Обикновено абстрактните класове, известни също като абстрактни базови класове (ABC), не могат да бъдат създадени (не може да бъде създаден екземпляр на този клас). Така че абстрактните класове са смислени само ако езикът за програмиране поддържа наследяване (способност за създаване на подкласове от разширяване на клас). Абстрактните класове обикновено представляват абстрактна концепция или обект с частична или никаква реализация. Следователно абстрактните класове действат като родителски класове, от които се извличат дъщерни класове, така че дъщерният клас ще споделя непълните функции на родителския клас и може да се добави функционалност, за да ги завърши.
Абстрактните класове могат да съдържат абстрактни методи. Подкласовете, разширяващи абстрактен клас, могат да имплементират тези (наследени) абстрактни методи. Ако дъщерният клас имплементира всички подобни абстрактни методи, той е конкретен клас. Но ако не стане, дъщерният клас също става абстрактен клас. Всичко това означава, че когато програмистът номинира клас като Abstract, той казва, че класът ще бъде непълен и ще има елементи, които трябва да бъдат завършени от наследяващите подкласове. Това е добър начин за създаване на договор между двама програмисти, който опростява задачите при разработването на софтуер. Програмистът, който пише код за наследяване, трябва да следва точно дефинициите на метода (но разбира се може да има собствена реализация).
Какво е интерфейс?
Интерфейсът е абстрактен тип, който се използва за определяне на договор, който трябва да бъде имплементиран от класове, които имплементират този интерфейс. Ключовата дума interface се използва за дефиниране на интерфейс, а ключовата дума Implements се използва за имплементиране на интерфейс от клас (в езика за програмиране Java). Обикновено интерфейсът ще съдържа само сигнатури на методи и константни декларации. Всеки интерфейс, който имплементира определен интерфейс, трябва да имплементира всички методи, дефинирани в интерфейса, или трябва да бъде деклариран като абстрактен клас. В Java типът препратка към обект може да се дефинира като тип интерфейс. Но този обект трябва или да е нулев, или да съдържа обект от клас, който имплементира този конкретен интерфейс. Използвайки ключовата дума Implements в Java, можете да внедрите множество интерфейси към един клас.
Каква е разликата между абстрактен клас и интерфейс?
Абстрактните класове обикновено представляват абстрактна концепция или обект с частична или никаква реализация. От друга страна, интерфейсът е абстрактен тип, който се използва за указване на договор, който трябва да бъде изпълнен от класове. Абстрактните класове трябва да бъдат наследени (или разширени), докато интерфейсите трябва да бъдат реализирани. Абстрактните класове могат да съдържат абстрактни методи, докато интерфейсът трябва да съдържа само абстрактни методи. Абстрактните класове могат да съдържат всякакви променливи, но интерфейсите могат да дефинират само константи. Един клас не може да наследява от повече от един абстрактен клас, но може да реализира множество интерфейси. Един интерфейс не може да реализира друг интерфейс. Интерфейсът обаче може да разшири клас.