В чем разница между интерфейсом и абстрактным классом?

Это НЕ ООП «фундаментальный».

Это просто выбор языка на некоторых языках, таких как Java.

Объектно-ориентированное программирование просто означает для модели проблема с использованием объектов, называемых «объекты» , которые имеют состояние и поведение . Он ничего не говорит о том, куда должен идти ваш код.

На самом деле вы можете создавать «объекты», даже не имея классов в первую очередь. Просто верните делегат, у которого есть закрытие, и у вас есть объект.

Пример:

//An "adder" that adds the value you give it to its current value
Converter<int, int> MakeAdder(int addend) //"constructor"
{
    return msg =>
    {
        addend += msg;
        return addend;
    };
}

//...
var adder = MakeAdder(100); //Now I have an adder object!
for (int i = 0; i < 10; i++)
    Console.WriteLine(adder(i));

Это полностью рядом с тем, что лямбда в C # является классом. Вы можете сделать что-то подобное на языке, таком как Scheme, где нет такой вещи, как «класс» или «объект», который существует фундаментально, только лямбда.

1663
задан brice 2 February 2017 в 17:36
поделиться

5 ответов

Интерфейсы

Интерфейс - это контракт : Человек, пишущий интерфейс, говорит: « эй, я согласен с тем, что выглядит так », и человек, использующий интерфейс, говорит: « Хорошо, класс, который я пишу, выглядит так ».

Интерфейс - это пустая оболочка . Есть только сигнатуры методов, что означает, что у методов нет тела. Интерфейс ничего не может сделать. Это просто шаблон.

Например (псевдокод):

// 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__).

Как обычно в программировании, есть теория, практика и практика на другом языке: - )

2194
ответ дан 22 November 2019 в 20:09
поделиться

В (JAVA) условий практичности, существенном различии между абстрактным классом и интерфейсом , Абстрактный класс может содержать состояние. Кроме содержания состояния мы можем достигнуть операций отдыха с Интерфейсом также.

1
ответ дан 22 November 2019 в 20:09
поделиться

Not really the answer to the original question, but once you have the answer to the difference between them, you will enter the when-to-use-each dilemma: When to use interfaces or abstract classes? When to use both?

I've limited knowledge of OOP, but seeing interfaces as an equivalent of an adjective in grammar has worked for me until now (correct me if this method is bogus!). For example, interface names are like attributes or capabilities you can give to a class, and a class can have many of them: ISerializable, ICountable, IList, ICacheable, IHappy, ...

4
ответ дан 22 November 2019 в 20:09
поделиться

Объяснение можно найти здесь: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract- Classes-and-the-Adapter-Pattern.htm

Абстрактный класс - это класс, который лишь частично реализовано программист. Он может содержать один или несколько абстрактные методы. Абстрактный метод это просто определение функции, которая служит, чтобы сообщить программисту, что метод должен быть реализован в дочернем class.

Интерфейс похож на абстрактный учебный класс; действительно интерфейсы занимают то же пространство имен, что и классы и абстрактные классы. По этой причине вы не можете определить интерфейс с тем же именем как класс. Интерфейс - это полностью абстрактный класс; ни один из его методов реализованы и вместо класса выделение из него, говорят, реализовать этот интерфейс.

В любом случае я нахожу это объяснение интерфейсов несколько запутанным. Более общее определение: Интерфейс определяет контракт, который должны выполняться реализующими классами. Определение интерфейса состоит из подписей общедоступных членов, без какого-либо кода реализации.

80
ответ дан 22 November 2019 в 20:09
поделиться

Некоторые особенности Oracle, которые мне действительно нравятся, - это

  • Real Application Clusters, довольно мощный способ создания кластеров баз данных.
  • Быстро обновляемые материализованные представления, очень эффективный способ хранения и обновления результатов запросов
  • Аналитические функции (также известные как оконные функции), которые позволяют эффективно группировать функции по подмножеству результатов запроса. Это позволяет избежать самосоединения в большинстве случаев.

Насколько мне известно, ничего из этого не доступно в MySQL. И есть еще много полезных функций, особенно в корпоративной версии и ее опциях.

  • Аналогичным образом, интерфейс, расширяющий другой интерфейс, не отвечает за реализацию методов из родительского интерфейса. Это связано с тем, что интерфейсы не могут определять какую-либо реализацию.

  • Дочерний класс может расширять только один класс (абстрактный или конкретный), тогда как интерфейс может расширяться, а класс может реализовывать несколько других интерфейсов 1131948].

  • Дочерний класс может определять абстрактные методы с такой же или менее ограниченной видимостью , тогда как класс, реализующий интерфейс, должен определять методы с точно такой же видимостью (общедоступный).

  • 847
    ответ дан 22 November 2019 в 20:09
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: