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


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


1435


источник


Ответы:


Интерфейсы

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

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

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

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

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


1930



Основные технические различия между абстрактный класс и интерфейс находятся:

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

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

  • При наследовании абстрактного класса бетон дочерний класс должны определять абстрактные методы , тогда как абстрактный класс может расширять другой абстрактный класс, а абстрактные методы из родительского класса не должны определяться.

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

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

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


725



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

enter image description here

Взято из:

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


101



An explanation can be found here: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

An abstract class is a class that is only partially implemented by the programmer. It may contain one or more abstract methods. An abstract method is simply a function definition that serves to tell the programmer that the method must be implemented in a child class.

An interface is similar to an abstract class; indeed interfaces occupy the same namespace as classes and abstract classes. For that reason, you cannot define an interface with the same name as a class. An interface is a fully abstract class; none of its methods are implemented and instead of a class sub-classing from it, it is said to implement that interface.

Anyway I find this explanation of interfaces somewhat confusing. A more common definition is: An interface defines a contract that implementing classes must fulfill. An interface definition consists of signatures of public members, without any implementing code.


74



Some important differences:

In the form of a table:

Difference

As stated by Joe from javapapers:

1.Main difference is methods of a Java interface are implicitly abstract and cannot have implementations. A Java abstract class can have instance methods that implements a default behavior.

2.Variables declared in a Java interface is by default final. An abstract class may contain non-final variables.

3.Members of a Java interface are public by default. A Java abstract class can have the usual flavors of class members like private, protected, etc..

4.Java interface should be implemented using keyword “implements”; A Java abstract class should be extended using keyword “extends”.

5.An interface can extend another Java interface only, an abstract class can extend another Java class and implement multiple Java interfaces.

6.A Java class can implement multiple interfaces but it can extend only one abstract class.

7.Interface is absolutely abstract and cannot be instantiated; A Java abstract class also cannot be instantiated, but can be invoked if a main() exists.

8.In comparison with java abstract classes, java interfaces are slow as it requires extra indirection.


34



I don't want to highlight the differences, which have been already said in many answers ( regarding public static final modifiers for variables in interface & support for protected, private methods in abstract classes)

In simple terms, I would like to say:

interface: To implement a contract by multiple unrelated objects

abstract class: To implement the same or different behaviour among multiple related objects

From the Oracle documentation

Consider using abstract classes if :

  1. You want to share code among several closely related classes.
  2. You expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private).
  3. You want to declare non-static or non-final fields.

Consider using interfaces if :

  1. You expect that unrelated classes would implement your interface. For example,many unrelated objects can implement Serializable interface.
  2. You want to specify the behaviour of a particular data type, but not concerned about who implements its behaviour.
  3. You want to take advantage of multiple inheritance of type.

abstract class establishes "is a" relation with concrete classes. interface provides "has a" capability for classes.

If you are looking for Java as programming language, here are a few more updates:

Java 8 has reduced the gap between interface and abstract classes to some extent by providing a default method feature. An interface does not have an implementation for a method is no longer valid now.

Refer to this documentation page for more details.

Have a look at this SE question for code examples to understand better.

How should I have explained the difference between an Interface and an Abstract class?


32



The main point is that:

  • Abstract is object oriented. It offers the basic data an 'object' should have and/or functions it should be able to do. It is concerned with the object's basic characteristics: what it has and what it can do. Hence objects which inherit from the same abstract class share the basic characteristics (generalization).
  • Interface is functionality oriented. It defines functionalities an object should have. Regardless what object it is, as long as it can do these functionalities, which are defined in the interface, it's fine. It ignores everything else. An object/class can contain several (groups of) functionalities; hence it is possible for a class to implement multiple interfaces.

21



When you want to provide polymorphic behaviour in an inheritance hierarchy, use abstract classes.

When you want polymorphic behaviour for classes which are completely unrelated, use an interface.


18



I am constructing a building of 300 floors

The building's blueprint interface

  • For example, Servlet(I)

Building constructed up to 200 floors - partially completed---abstract

  • Partial implementation, for example, generic and HTTP servlet

Building construction completed-concrete

  • Full implementation, for example, own servlet

Interface

  • We don't know anything about implementation, just requirements. We can go for an interface.
  • Every method is public and abstract by default
  • It is a 100% pure abstract class
  • If we declare public we cannot declare private and protected
  • If we declare abstract we cannot declare final, static, synchronized, strictfp and native
  • Every interface has public, static and final
  • Serialization and transient is not applicable, because we can't create an instance for in interface
  • Non-volatile because it is final
  • Every variable is static
  • When we declare a variable inside an interface we need to initialize variables while declaring
  • Instance and static block not allowed

Abstract

  • Partial implementation
  • It has an abstract method. An addition, it uses concrete
  • No restriction for abstract class method modifiers
  • No restriction for abstract class variable modifiers
  • We cannot declare other modifiers except abstract
  • No restriction to initialize variables

Taken from DurgaJobs Website


18



Let's work on this question again:

The first thing to let you know is that 1/1 and 1*1 results in the same, but it does not mean that multiplication and division are same. Obviously, they hold some good relationship, but mind you both are different.

I will point out main differences, and the rest have already been explained:

Abstract classes are useful for modeling a class hierarchy. At first glance of any requirement, we are partially clear on what exactly is to be built, but we know what to build. And so your abstract classes are your base classes.

Interfaces are useful for letting other hierarchy or classes to know that what I am capable of doing. And when you say I am capable of something, you must have that capacity. Interfaces will mark it as compulsory for a class to implement the same functionalities.


16



An explanation can be found in Interface VS Abstract Class in PHP.

CONCLUSIONS

Abstract classes are used to share functions. The interfaces are used to share how you have to do something.


10