В чем разница между интерфейсом и абстрактным классом?
Интерфейс - это контракт: Человек, пишущий интерфейс, говорит: "Эй, я принимаю вещи, выглядящие таким образом", а человек, использующий интерфейс, говорит: "ОК, класс, который я пишу, выглядит таким образом".
Интерфейс - это пустая оболочка. Есть только сигнатуры методов, что подразумевает, что у методов нет тела. Интерфейс не может ничего делать. Это просто шаблон.
Например (псевдокод):
// 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;
}
}
Реализация интерфейса потребляет очень мало CPU, потому что это не класс, а просто набор имен, и поэтому не нужно выполнять дорогостоящий поиск. Это хорошо, когда это имеет значение, например, во встроенных устройствах.
Абстрактные классы, в отличие от интерфейсов, являются классами. Они более дороги в использовании, поскольку при наследовании от них необходимо выполнять поиск.
Абстрактные классы очень похожи на интерфейсы, но у них есть кое-что еще: Вы можете определить их поведение. Это больше похоже на человека, который говорит: "эти классы должны выглядеть так-то, и у них есть то-то, поэтому заполните пробелы!".
Например:
// 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, а на самом деле это использование метаклассов, а значит, и классов. А интерфейсы больше связаны с утиной типизацией в этом языке и представляют собой смесь между соглашениями и специальными методами, которые вызывают дескрипторы (___метод___методы).
Как обычно в программировании, есть теория, практика и практика на другом языке :-)
Ключевые технические отличия абстрактный класс и интерфейс являются:
Абстрактные классы могут иметь constants, элементы, заглушки методов (методы без тела) и определенными methods, в то время как интерфейсы могут только constants и methods stubs.
Методы и члены абстрактного класса могут быть определены с visibility_ _любой, в то время как все методы интерфейса должны быть определены как "общественность" (они определяются публичными по умолчанию).
Когда наследующий абстрактный класс, А Б класс must ребенка определяют абстрактный methods, в то время как абстрактный класс может расширять другой абстрактного класса и абстрактного метода из родительского класса Дон'т должны быть определенными.
Аналогично, интерфейс расширяет другой интерфейс not, ответственных за реализацию methods от родительского интерфейса. Это потому, что интерфейсы не могут определить любой реализации.
Ребенок может лишь extend один class (абстрактный или конкретный), в то время как интерфейс может продлить или класс может implement несколько других interfaces.
Ребенок класса могут определять абстрактные методы с same или менее строгими visibility, в то время как класс, реализующий интерфейс, должен определить методы, с точно такой же видимости (Public).
Интерфейс содержит только определение / подпись функциональность, и если у нас есть некоторые общие функциональные возможности, а также общие сигнатуры, то мы должны использовать абстрактный класс. С помощью абстрактного класса, мы можем предоставить поведения, а также функциональность и в то же время. Другой разработчик, наследующий абстрактный класс может легко использовать эту функцию, так как им будет необходимо лишь восполнить пробелы.
Взято из:
http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html
http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in-c-net.html
Объяснение можно найти здесь: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm
Абстрактный класс - это класс, который только частично реализованный программистом. Он может содержать один или несколько абстрактных методов. Абстрактный метод это просто определение функции, которое служит для того, чтобы сообщить программисту, что данный метод должен быть реализован в дочернем классе.
Интерфейс похож на абстрактный классу; действительно, интерфейсы занимают то же пространство имен, что и классы и абстрактные > классы. классы. По этой причине вы не можете определить интерфейс с тем же именем. как класс. Интерфейс - это полностью абстрактным классом; ни один из его методов не реализованы, и вместо класса подкласса от него, говорят, что он > реализует этот интерфейс. реализовать этот интерфейс.
В любом случае, я нахожу такое объяснение интерфейсов несколько запутанным. Более распространенным определением является следующее: Интерфейс определяет контракт, который классы-реализаторы должны выполнять. Определение интерфейса состоит из подписей открытых членов, без какого-либо кода реализации.
Я не'т хотим, чтобы подчеркнуть различия, которые были сказаны в много ответов ( относительно общедоступные статические заключительные модификаторы переменных в интерфейс &усилителя; поддержка защищенных, частные методы в абстрактных классах)
В простых терминах, я хочу сказать:
интерфейс: для реализации договора нескольких несвязанных объектов
абстрактный класс: для реализации такой же или иную модель поведения из нескольких связанных объектов
Из Oracle документация
Рекомендуется использовать абстрактные классы если :
Рассмотрите возможность использования интерфейсов если :
интерфейс Serializable
.аннотация устанавливает, что " класса;это" в связи с конкретными классами. интерфейс обеспечивает "есть" и возможность для занятий.
Если вы ищете Ява
, как язык программирования, вот еще несколько обновлений:
В Java 8 сократил разрыв между интерфейс
и абстрактный
классы до некоторой степени, обеспечивая "по умолчанию" характеристика метода. Интерфейс не имеет реализации метода сейчас уже не действует.
Обратитесь к этой документации Страница для более подробной информации.
Взгляните на этот вопрос для примеров кода, чтобы лучше понять.
Некоторые важные отличия:
В виде таблицы:
Как заявил Джо из javapapers]2:
1.Главное отличие методов интерфейса Java неявно являются абстрактными и не имеют реализации. На Java абстрактный класс может есть методы экземпляра, который реализует поведение по умолчанию.
2.Переменные, объявленные в интерфейсе Java является окончательным по умолчанию. Абстрактный класс может содержать не-Final переменные.
3.Члены интерфейс java являются открытыми по умолчанию. На Java, абстрактный класс может иметь обычных вкусов членов класса как частный, защиту и т. д..
интерфейс 4.java должна быть реализована с использованием ключевым словом “реализует”; в Java абстрактный класс должен быть расширен с помощью сайта “расширяет”.
5.Интерфейс может распространяться только другой Java-интерфейса, абстрактный класс может расширять другой класс java и реализовать несколько Ява интерфейсы.
6.Java-класс может реализовывать несколько интерфейсов, но его можно продлить только один абстрактный класс.
7.Интерфейс абсолютно абстрактна и не может быть установлен; на Java абстрактный класс не может быть инстанцирован, но может быть вызван если основной() существует.
8.В сравнение с абстрактными классами в Java, интерфейсы Java медленно, так как требует дополнительной косвенности.
Главное заключается в том, что:
Я построить дом в 300 этажей
Здание'ы план интерфейс
Здание построено до 200 пол - частично---аннотация
Строительство завершено-бетон
Интерфейс
Аннотация
Взято из DurgaJobs сайт
Позвольте's снова работать на этот вопрос:
Первым делом, чтобы вы знали, что 1/1 и 1*1 того же результата, но это не значит, что умножение и деление имеют одинаковый. Очевидно, они держат хорошие отношения, но оба разные.
Я укажу основные отличия, а остальное уже объяснил:
Абстрактные классы полезны для моделирования иерархии классов. На первый взгляд каких-либо требований, мы частично понятно о том, что именно должен быть построен, но мы знаем что строить. И поэтому ваши абстрактные классы базовый классы.
Интерфейсы полезны для сдачи других иерархий или классов, должны знать, что я способен сделать. И когда вы говорите, что я способна на что-то, вы должны иметь эту способность. Интерфейсы он будет помечен как обязательный для класса для реализации той же функции.
Это's фактически довольно прост.
Вы можете придумать интерфейс как класс, который позволено иметь абстрактные методы, и ничего больше.
Так что интерфейс может лишь "объявить" и не определяют поведения в классе.
Абстрактный класс позволяет делать как объявить (с помощью абстрактных методов), а также определить (используя полный реализаций метода) нужное поведение в классе.
И обычный класс только позволяет определить, не заявляю, поведение/действия, которые вы хотите, чтобы класса.
Одна последняя вещь,
В Java, вы можете реализовывать несколько интерфейсов, но можно продлить только один (абстрактный класс или класс)...
Это означает, наследование определенного поведения ограничивается только один в классе... т. е. если требуется создать класс, который инкапсулированное поведение из классов А,Б&c вы должны выполнить следующие действия: расширяет класс B, класс c простирается .. его немного кружным путем, чтобы иметь множественное наследование...
Интерфейсы с другой стороны, вы можете просто сделать: интерфейс C реализует, Б
Так что по сути Java поддерживает множественное наследование только в "объявил поведения" и интерфейсы, т. е. И лишь одиночное наследование с определенными поведение.. если вы не вокруг, как я описал...
Надеюсь, что имеет смысл.
Сравнение интерфейс и абстрактный класс-это неправильно. Там должны быть две другие сравнения: 1) интерфейс класса и и 2) аннотация и заключительный класс.
Интерфейс - это контракт между двумя объектами. Е. Г., Я'м почтальоном и вы'повторно пакет для доставки. Я ожидаю, что вы знаете свой адрес доставки. Когда кто-то дает мне пакет, он должен знать ее адрес поставки:
interface Package {
String address();
}
Класс это группа объектов, которые подчиняются контракта. Е. Г., Я'м коробку от "Окна" и группа, и я подчиняюсь контракта требуется почтальон. В то же время я подчиняюсь другим договорам:
class Box implements Package, Property {
@Override
String address() {
return "5th Street, New York, NY";
}
@Override
Human owner() {
// this method is part of another contract
}
}
Абстрактный класс группа неполного объектов. Они могут'т быть использованы, потому что им не хватает некоторых деталей. Е. Г., Я'м абстрактной ГПС-известны окно - я знаю, как проверить свою позицию на карте:
abstract class GpsBox implements Package {
@Override
public abstract String address();
protected Coordinates whereAmI() {
// connect to GPS and return my current position
}
}
Этот класс, если в наследство/продлен еще на один класс, могут быть очень полезны. Но сам по себе - это бесполезно, так как это может'т иметь объекты. Абстрактные классы могут быть строительные элементы выпускных классов.
Заключительный класс это группа законченных объектов, которые могут быть использованы, но может'т быть изменен. Они точно знают, как работать и что делать. Е. Г., Я'м коробка, которая всегда идет по адресу, указанному во время его строительства:
final class DirectBox implements Package {
private final String to;
public DirectBox(String addr) {
this.to = addr;
}
@Override
public String address() {
return this.to;
}
}
В большинстве языков, как Java или C++, можно просто класс, ни абстрактным, ни окончательной. Такой класс может быть унаследован и может быть создан. Я не'т думаю, что это хоть и строго в соответствии с объектно-ориентированной парадигме.
Опять же, сравнивая интерфейсы абстрактные классы не корректно.
Единственная разница заключается в том, что можно участвовать в множественное наследование и другие не могут.
Определение интерфейса был изменен с течением времени. Как вы думаете, интерфейс просто только объявления методов и составляют договоры? Насчет статические Final переменные и насчет определения по умолчанию после Java 8?
Интерфейсы были введены в Java из-за бриллиант проблемы с множественным наследованием и что'то, что они на самом деле намерены делать.
Интерфейсы являются конструкции, которые были созданы, чтобы уйти с несколькими проблему наследования и может иметь абстрактные методы, определения по умолчанию и статические Final переменные.
Короче различия заключаются в следующем:
Синтаксические различия между интерфейс и абстрактный класс:
В интерфейсах сейчас:
статический
- поддерживается
абстрактный
- поддержал
по умолчанию
- поддерживается
частных статических- поддерживается
частная абстрактное` - ошибка компиляции
частные умолчанию - ошибка компиляции
"частный" - поддержали
Интерфейс: Поворот ( Повернуть Налево, Повернуть Направо.)
Абстрактный Класс: Колесо.
Класс: руль, производный от колеса, интерфейс подвергает свою очередь
Для категоризации поведения, которая может быть предложена в самых разных вещей, другой-для моделирования онтологии вещей.
Если у вас есть некоторые общие методы, которые могут использоваться несколькими классами ходят на абстрактные классы. Еще если вы хотите, чтобы занятия следить за какой-то определенный план пойти на интерфейсы.
Следующие примеры демонстрируют это.
Абстрактный класс в Java:
abstract class animals
{
// They all love to eat. So let's implement them for everybody
void eat()
{
System.out.println("Eating...");
}
// The make different sounds. They will provide their own implementation.
abstract void sound();
}
class dog extends animals
{
void sound()
{
System.out.println("Woof Woof");
}
}
class cat extends animals
{
void sound()
{
System.out.println("Meoww");
}
}
Следующее-это реализация интерфейса в Java:
interface Shape
{
void display();
double area();
}
class Rectangle implements Shape
{
int length, width;
Rectangle(int length, int width)
{
this.length = length;
this.width = width;
}
@Override
public void display()
{
System.out.println("****\n* *\n* *\n****");
}
@Override
public double area()
{
return (double)(length*width);
}
}
class Circle implements Shape
{
double pi = 3.14;
int radius;
Circle(int radius)
{
this.radius = radius;
}
@Override
public void display()
{
System.out.println("O"); // :P
}
@Override
public double area()
{
return (double)((pi*radius*radius)/2);
}
}
Некоторые важные ключевые моменты в двух словах:
Переменные, объявленные в Java интерфейс от окончательного дефолта. Абстрактные классы могут иметь неокончательный переменных.
Переменные, объявленные в Java интерфейса по статической умолчанию. Абстрактные классы могут иметь нестатических переменных.
Члены интерфейс java являются открытыми по умолчанию. На Java, абстрактный класс может иметь обычных вкусов членов класса как частный, защищенный и т. д..
Это не совсем ответ на первоначальный вопрос, но как только вы получите ответ на разницу между ними, вы попадете в дилемму "когда использовать каждый": https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both
У меня ограниченные познания в ООП, но рассмотрение интерфейсов как эквивалента прилагательного в грамматике работало для меня до сих пор (поправьте меня, если этот метод ошибочен!). Например, имена интерфейсов похожи на атрибуты или возможности, которые вы можете дать классу, и у класса их может быть много: ISerializable, ICountable, IList, ICacheable, IHappy, ...
Чтобы дать простой, но ясный ответ, он помогает установить контекст : вы можете использовать оба, если вы не хотите, чтобы обеспечить полную реализацию.
Затем основным отличием является интерфейс не имеет реализации на всех (только методы без тела), а абстрактные классы могут иметь элементы и методы с тела, т. е. могут быть выполнены частично.
Вы можете найти четкое различие между интерфейс и абстрактный класс.
Интерфейс
Абстрактный класс
Абстрактный класс, содержащий абстрактные и неабстрактные методы.
Не принуждает пользователей реализовать все методы, когда унаследовал абстрактный класс.
Содержит все виды переменных, включая примитивные и непримитивные
Заявляю, используя ключевое слово Abstract.
Методы и члены абстрактного класса могут быть определены с любой видимость.
Ребенок может лишь продлить один класс (абстрактный или конкретный).
Наследование используется для двух целей:
Чтобы привести объект в отношении родитель-тип элементов данных и реализации методов, как свои собственные.
Чтобы разрешить ссылку на объекты одного типа могут использоваться в коде, который ожидает ссылку на объект супертипа.
В языков/фреймворков, которые поддерживают обобщенное множественного наследования, нет практически никакой необходимости классифицировать тип, либо быть собой " интерфейс и" или на " и"; абстрактный класс;. Популярных языках и фреймворках, однако, позволит тип связи один другой тип'элементы данных или способ реализации, как собственных, хотя они позволяют типа могут обмениваться на произвольное число других типов.
Абстрактные классы могут содержать элементы данных и реализации методов, но может только быть унаследованы классы, которые Дон'т наследовать от других классов. Интерфейсы ставят практически никаких ограничений на типы, которые их реализовать, но не может включать любые элементы данных или реализации метода.
Есть времена, когда он's полезный для типов, чтобы быть взаимозаменяемыми для различных вещей; есть и другие времена, когда он's, удобен для объектов, в отношении родителей-тип элементов данных и реализации методов, как свои собственные. Делая различие между интерфейсами и абстрактными классами позволяет каждой из этих способностей должны использоваться в тех случаях, когда она имеет самое непосредственное отношение.