Vraag Wat is het verschil tussen een interface en een abstracte klasse?


Wat is precies het verschil tussen een interface en een abstracte klasse?


1468
2017-12-16 08:15


oorsprong


antwoorden:


interfaces

Een interface is een contract: De persoon die de interface schrijft zegt:hey, ik accepteer dingen die er zo uitzien", en de persoon die de interface gebruikt zegt"OK, de klas die ik schrijf ziet er zo uit".

Een interface is een lege schaal. Er zijn alleen de handtekeningen van de methoden, wat impliceert dat de methoden geen lichaam hebben. De interface kan niets doen. Het is maar een patroon.

Bijvoorbeeld (pseudo-code):

// 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;
    }
}

Het implementeren van een interface kost heel weinig CPU, omdat het geen klasse is, maar een hoop namen, en daarom is er geen dure look-up om te doen. Het is geweldig als het ertoe doet, zoals in ingesloten apparaten.


Abstracte klassen

Abstracte klassen, in tegenstelling tot interfaces, zijn klassen. Ze zijn duurder in gebruik, omdat er een opzoekactie is om te doen wanneer je van ze erven.

Abstracte klassen lijken veel op interfaces, maar ze hebben iets meer: ​​je kunt een gedrag voor hen definiëren. Het gaat meer om een ​​persoon die zegt: "deze klassen zouden er zo uit moeten zien, en dat hebben ze gemeen, dus vul de lege plekken in!".

Bijvoorbeeld:

// 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");
    }
}

Implementatie

Hoewel abstracte klassen en interfaces verondersteld worden verschillende concepten te zijn, maken de implementaties die verklaring soms onwaar. Soms zijn ze niet eens wat je denkt dat ze zijn.

In Java wordt deze regel sterk gehandhaafd, terwijl in PHP, interfaces abstracte klassen zijn zonder gedeclareerde methode.

In Python zijn abstracte klassen meer een programmeer-truc die je kunt krijgen van de ABC-module en in werkelijkheid metaclasses gebruikt, en dus klassen. En interfaces zijn meer gerelateerd aan eendtypen in deze taal en het is een mix tussen conventies en speciale methoden die descriptoren noemen (de __method__-methoden).

Zoals gebruikelijk bij het programmeren, is er theorie, oefening en oefening in een andere taal :-)


1966
2017-12-16 08:37



De belangrijkste technische verschillen tussen een abstracte klasse en een interface zijn:

  • Abstracte klassen kunnen hebben constanten, leden, methodestubs (methoden zonder een body) en gedefinieerde methoden, terwijl interfaces alleen maar kunnen hebben constanten en methodestubs.

  • Methoden en leden van een abstracte klasse kunnen worden gedefinieerd met elke zichtbaarheid, terwijl alle methoden van een interface moeten worden gedefinieerd als public (ze zijn standaard standaard gedefinieerd).

  • Wanneer een abstracte klasse wordt geërfd, beton kinder klas moet de abstracte methoden definiëren, terwijl een abstracte klasse een andere abstracte klasse kan uitbreiden en abstracte methoden uit de bovenliggende klasse niet hoeven te worden gedefinieerd.

  • Evenzo is een interface die een andere interface verlengt niet verantwoordelijk voor het implementeren van methodenvan de ouderinterface. Dit komt omdat interfaces geen enkele implementatie kunnen definiëren.

  • Een kinderklasse kan alleen een enkele klasse uitbreiden (abstract of concreet), terwijl een interface kan worden uitgebreid of een klasse kan implementeer meerdere andere interfaces.

  • Een kinderklasse kan abstracte methoden definiëren met de dezelfde of minder beperkende zichtbaarheid, terwijl een klasse die een interface implementeert, de methoden moet definiëren met exact dezelfde zichtbaarheid (openbaar).


749
2017-12-16 10:11



Een interface bevat alleen de definitie / handtekening van functionaliteit. Als we gemeenschappelijke functionaliteit en algemene handtekeningen hebben, moeten we een abstracte klasse gebruiken. Door een abstracte klasse te gebruiken, kunnen we zowel gedrag als functionaliteit bieden, beide in dezelfde tijd. Een andere ontwikkelaar die abstracte klasse overerft, kan deze functionaliteit eenvoudig gebruiken, omdat ze alleen de lege plekken hoeven in te vullen.

enter image description here

Genomen van:

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


108
2017-09-15 08:59



Een verklaring is hier te vinden: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

Een abstracte klasse is een klasse die dat wel is   slechts gedeeltelijk geïmplementeerd door de   programmeur. Het kan een of meer bevatten   abstracte methoden. Een abstracte methode   is gewoon een functiedefinitie die   dient om de programmeur te vertellen dat het   methode moet worden geïmplementeerd in een kind   klasse.

Een interface is vergelijkbaar met een abstract   klasse; interfaces nemen inderdaad de   dezelfde naamruimte als klassen en abstract   klassen. Om die reden kan dat niet   definieer een interface met dezelfde naam   als een klas. Een interface is een volledig   abstracte klasse; geen van zijn methoden   zijn geïmplementeerd en in plaats van een klasse   er van wordt onderverdeeld, wordt gezegd   implementeer die interface.

Hoe dan ook vind ik deze uitleg van interfaces enigszins verwarrend. Een meer algemene definitie is: Een interface definieert een contract waaraan implementatieklassen moeten voldoen. Een interfacedefinitie bestaat uit handtekeningen van openbare leden, zonder enige implementatiecode.


76
2017-12-16 08:18



Enkele belangrijke verschillen:

In de vorm van een tafel:

Difference

Als verklaard door Joe van javapapers:

1. Belangrijk verschil is dat de methoden van een Java-interface impliciet abstract zijn en geen implementaties kunnen hebben. Een Java-abstracte klasse kan   hebben bijvoorbeeld methoden die een standaardgedrag implementeren.

2. Variabelen die zijn gedeclareerd in een Java-interface zijn standaard definitief. Een abstracte klasse kan niet-definitieve variabelen bevatten.

3. Leden van een Java-interface zijn standaard openbaar. Een Java-abstracte les kan de gebruikelijke smaken van groepsleden hebben zoals privé,   beschermd, enz ..

4.Java-interface moet worden geïmplementeerd met behulp van trefwoord "implementeert"; Een Java-abstracte klasse moet worden uitgebreid met het trefwoord "extends".

5. Een interface kan alleen een andere Java-interface uitbreiden, een abstracte klasse kan een andere Java-klasse uitbreiden en meerdere Java implementeren   interfaces.

6. Een Java-klasse kan meerdere interfaces implementeren, maar het kan slechts één abstracte klasse uitbreiden.

7.Interface is absoluut abstract en kan niet worden geïnstantieerd; Een Java-abstractklasse kan ook niet worden geïnstantieerd, maar kan worden aangeroepen als een   hoofd () bestaat.

8.In vergelijking met Java abstracte klassen zijn Java-interfaces traag omdat het extra indirectie vereist.


36
2018-05-16 05:55



Ik wil de verschillen niet benadrukken, die al in veel antwoorden zijn gezegd (met betrekking tot openbare statische laatste modifiers voor variabelen in interface & ondersteuning voor beschermde, privémethoden in abstracte klassen)

In eenvoudige termen zou ik willen zeggen:

interface: Een contract implementeren door meerdere niet-gerelateerde objecten

abstracte klasse: Om hetzelfde of ander gedrag tussen meerdere gerelateerde objecten te implementeren

Van het Oracle documentatie

Overweeg het gebruik van abstracte klassen als :

  1. U wilt code delen tussen verschillende nauw verwante klassen.
  2. Je verwacht dat klassen die je abstracte klasse uitbreiden veel gemeenschappelijke methoden of velden hebben, of andere toegangsmodificatoren nodig hebben dan openbaar (zoals beschermd en privé).
  3. U wilt niet-statische of niet-definitieve velden declareren.

Overweeg om interfaces te gebruiken als :

  1. Je verwacht dat niet-gerelateerde klassen je interface zouden implementeren. Veel niet-gerelateerde objecten kunnen bijvoorbeeld worden geïmplementeerd Serializable interface.
  2. U wilt het gedrag van een bepaald gegevenstype specificeren, maar u hoeft zich geen zorgen te maken over wie het gedrag implementeert.
  3. U wilt profiteren van meerdere overerving van het type.

abstracte klasse vestigt "is een" relatie met concrete klassen. interface biedt "heeft een" mogelijkheid voor klassen.

Als u op zoek bent naar Java als programmeertaal, hier zijn nog enkele updates:

Java 8 heeft de kloof verkleind interface en abstract klassen tot op zekere hoogte door het verstrekken van een default methode functie. Een interface heeft geen implementatie voor een methode is nu niet langer geldig.

Raadpleeg deze documentatie pagina voor meer details.

Bekijk deze SE-vraag voor codevoorbeelden om beter te begrijpen.

Hoe zou ik het verschil tussen een interface en een abstracte klasse hebben uitgelegd?


34
2017-11-27 12:42



Het belangrijkste punt is dat:

  • Abstract is objectgericht. Het biedt de basisgegevens die een 'object' zou moeten hebben en / of functies die het zou moeten kunnen doen. Het gaat over de basiskenmerken van het object: wat het heeft en wat het kan doen. Objecten die overerven van dezelfde abstracte klasse delen dus de basiskenmerken (generalisatie).
  • Interface is functioneel georiënteerd. Het definieert functionaliteiten die een object zou moeten hebben. Ongeacht welk object het is, zolang het deze functionaliteiten, die in de interface zijn gedefinieerd, kan doen, is het prima. Het negeert al het andere. Een object / klasse kan verschillende (groepen van) functionaliteiten bevatten; vandaar dat het mogelijk is voor een klasse om meerdere interfaces te implementeren.

22
2017-09-29 09:54



Als u polymorf gedrag in een overervingshiërarchie wilt bieden, gebruikt u abstracte klassen.

Als u polymorf gedrag wilt voor klassen die totaal geen verband houden, gebruikt u een interface.


20
2018-05-28 04:42



Ik bouw een gebouw van 300 verdiepingen

De blauwdruk van het gebouw interface

  • Servlet (I) bijvoorbeeld

Gebouw opgebouwd tot 200 verdiepingen - gedeeltelijk voltooid ---abstract

  • Gedeeltelijke implementatie, bijvoorbeeld generieke en HTTP-servlet

Bouwconstructie voltooid-beton

  • Volledige implementatie, bijvoorbeeld een eigen servlet

Interface

  • We weten niets van de implementatie, alleen van eisen. We kunnen ga voor een interface.
  • Elke methode is standaard openbaar en abstract
  • Het is een 100% pure abstracte klasse
  • Als we het openbaar verklaren, kunnen we niet privé en beschermd verklaren
  • Als we abstract verklaren, kunnen we geen definitieve, statische, gesynchroniseerde, strictfp en native verklaren
  • Elke interface heeft openbaar, statisch en definitief
  • Serialisatie en van voorbijgaande aard is niet van toepassing, omdat we geen instantie voor in de interface kunnen maken
  • Niet-vluchtig omdat het definitief is
  • Elke variabele is statisch
  • Wanneer we een variabele in een interface declareren, moeten we variabelen initialiseren tijdens het declareren
  • Exemplaar en statisch blok niet toegestaan

Abstract

  • Gedeeltelijke implementatie
  • Het heeft een abstracte methode. Een toevoeging, het maakt gebruik van beton
  • Geen beperking voor abstracte modificatiemiddelen voor klassen
  • Geen beperking voor abstracte variabele modifiers voor klassen
  • We kunnen geen andere modifiers declareren behalve abstract
  • Geen beperking om variabelen te initialiseren

Genomen van de website van DurgaJobs


20
2017-07-09 18:00