Интерфейсы
Интерфейс - это контракт : человек, пишущий интерфейс, говорит: " эй, я принимаю вещи, выглядящие так ", а человек, использующий интерфейс, говорит " ОК, класс, который я пишу, выглядит так".
Интерфейс представляет собой пустую оболочку . Существуют только сигнатуры методов, что означает, что методы не имеют тела. Интерфейс не может ничего сделать. Это просто шаблон.
Например (псевдокод):
// I say all motor vehicles should look like this:
interface MotorVehicle
{
void run();
int getFuel();
}
// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
Реализация интерфейса потребляет очень мало ЦП, потому что это не класс, а просто набор имен, и, следовательно, поиск дорогостоящего не требует. Замечательно, когда это важно, например, во встроенных устройствах.
Абстрактные занятия
Абстрактные классы, в отличие от интерфейсов, являются классами. Они более дороги в использовании, потому что есть поиск, когда вы наследуете от них.
Абстрактные классы очень похожи на интерфейсы, но у них есть нечто большее: вы можете определить поведение для них. Это больше о человеке, который говорит: «Эти классы должны выглядеть так, и они имеют это общее, так что заполняйте пробелы!».
Например:
// I say all motor vehicles should look like this:
abstract class MotorVehicle
{
int fuel;
// They ALL have fuel, so lets implement this for everybody.
int getFuel()
{
return this.fuel;
}
// That can be very different, force them to provide their
// own implementation.
abstract void run();
}
// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
void run()
{
print("Wrroooooooom");
}
}
Осуществление
Хотя предполагается, что абстрактные классы и интерфейсы являются разными понятиями, реализации иногда делают это утверждение неверным. Иногда они даже не такие, как вы думаете.
В Java это правило строго соблюдается, тогда как в PHP интерфейсы являются абстрактными классами без объявленного метода.
В Python абстрактные классы - это больше трюк программирования, который вы можете получить из модуля ABC, и на самом деле он использует метаклассы и, следовательно, классы. А интерфейсы в большей степени связаны с типизацией утки на этом языке, и это смесь соглашений и специальных методов, вызывающих дескрипторы (методы __method__).
Как обычно в программировании, существует теория, практика и практика на другом языке: -)