it-swarm.com.de

Was ist die Definition von "Schnittstelle" in der objektorientierten Programmierung?

Ok, ein Freund von mir geht hin und her, was "Interface" in der Programmierung bedeutet.

Was ist die beste Beschreibung einer "Schnittstelle"?.

Für mich ist eine Schnittstelle ein Bauplan einer Klasse. Ist dies die beste Definition?

89

Eine Schnittstelle ist einer der überlasteten und verwirrenden Begriffe in der Entwicklung.

Es ist eigentlich ein Konzept von Abstraktion und Einkapselung. Für eine gegebene "Box" deklariert die "Eingänge" und "Ausgänge" dieser Box. In der Welt der Software bedeutet dies normalerweise die Operationen, die (zusammen mit Argumenten) auf der Box aufgerufen werden können, und in einigen Fällen die Rückgabetypen dieser Operationen.

Was es nicht tut, ist, dass es nicht definiert, was die Semantik dieser Operationen ist, obwohl es üblich (und sehr gute Praxis) ist, sie in der Nähe der Deklaration zu dokumentieren (z. B. über Kommentare) oder gute Namenskonventionen zu wählen . Es gibt jedoch keine Garantie dafür, dass diese Absichten befolgt werden. 

Hier ist eine Analogie: Schauen Sie sich Ihren Fernseher an, wenn er ausgeschaltet ist. Seine Schnittstelle sind die Tasten, die verschiedenen Stecker und der Bildschirm. Ihre Semantik und sein Verhalten sind, dass Eingaben (z. B. Kabelprogrammierung) und Ausgaben (Anzeigen auf dem Bildschirm, Ton usw.) vorgenommen werden. Wenn Sie jedoch ein Fernsehgerät betrachten, das nicht angeschlossen ist, projizieren Sie Ihre erwartete Semantik in eine Schnittstelle. Nach allem, was Sie wissen, könnte der Fernseher explodieren, wenn Sie ihn anschließen. Aufgrund seiner "Schnittstelle" können Sie jedoch davon ausgehen, dass er keinen Kaffee zubereitet, da er keinen Wasserzulauf hat. 

Bei der objektorientierten Programmierung definiert eine Schnittstelle im Allgemeinen die Menge von Methoden (oder Nachrichten), auf die eine Instanz einer Klasse, die diese Schnittstelle hat, antworten könnte. 

Zu der Verwirrung kommt hinzu, dass es in einigen Sprachen, wie beispielsweise Java, eine tatsächliche Schnittstelle mit ihrer sprachspezifischen Semantik gibt. In Java beispielsweise handelt es sich um eine Gruppe von Methodendeklarationen ohne Implementierung. Eine Schnittstelle entspricht jedoch auch einem Typ und folgt verschiedenen Typisierungsregeln. 

In anderen Sprachen wie C++ haben Sie keine Schnittstellen. Eine Klasse definiert selbst Methoden, aber Sie können sich das Interface der Klasse als Deklaration der nicht privaten Methoden vorstellen. Aufgrund der Art und Weise, wie C++ kompiliert wird, erhalten Sie Header-Dateien, an denen Sie die "Schnittstelle" der Klasse ohne tatsächliche Implementierung haben könnten. Sie können auch Java-Schnittstellen mit abstrakten Klassen mit reinen virtuellen Funktionen usw. nachahmen.

Ein Interface ist sicherlich kein Entwurf für eine Klasse. Ein Blueprint nach einer Definition ist ein "detaillierter Aktionsplan". Eine Schnittstelle verspricht nichts von einer Aktion! Die Quelle der Verwirrung ist, dass in den meisten Sprachen, wenn Sie über einen Schnittstellentyp verfügen, der einen Satz von Methoden definiert, die Klasse, die sie implementiert, die gleichen Methoden "wiederholt" (aber die Definition bereitstellt), sodass die Schnittstelle wie ein Skelett oder eine Struktur aussieht Gliederung der Klasse.

148
Uri

Betrachten Sie die folgende Situation:

Sie befinden sich mitten in einem großen, leeren Raum, als Sie plötzlich von einem Zombie angegriffen werden.

Sie haben keine Waffe.

Zum Glück steht ein lebender Mensch in der Tür des Zimmers.

"Schnell!" Sie schreien ihn an. "Wirf mir etwas zu, mit dem ich den Zombie schlagen kann!"

Betrachten wir nun:
Du hast nicht genau angegeben (und es interessiert dich auch nicht) was dein Freund wird wählen zu werfen;
... Aber es spielt keine Rolle, solange:

  • Es ist etwas, das kann geworfen werden (Er kann dich nicht auf das Sofa werfen)

  • Es ist etwas, das Sie ergreifen können (Hoffen wir, dass er keine Shuriken geworfen hat)

  • Es ist etwas, das Sie verwenden können, um das Gehirn des Zombies herauszuschlagen (das Kissen und so weiter ausschließt)

Es ist egal, ob Sie einen Baseballschläger oder einen Hammer bekommen -
Solange es Ihre drei Bedingungen umsetzt, sind Sie gut.

m es zusammenzufassen:

Wenn Sie eine Schnittstelle schreiben, sagen Sie im Grunde: "Ich brauche etwas, das ..."

152
Yehuda Shapira

Die Schnittstelle ist ein Vertrag, den Sie einhalten oder erfüllen sollten, je nachdem, ob Sie ein Implementierer oder ein Benutzer sind.

33
Eugene Kuleshov

Ich denke nicht, dass "Blaupause" ein gutes Wort ist. Ein Bauplan sagt Ihnen, wie Sie etwas bauen. Eine Benutzeroberfläche verhindert ausdrücklich, dass Sie wissen, wie Sie etwas erstellen.

Eine Schnittstelle definiert, wie Sie mit einer Klasse interagieren können, d. H. Welche Methoden sie unterstützt.

16
Dave Costa

Für mich ist eine Schnittstelle ein Bauplan einer Klasse. Ist dies die beste Definition?

Ein Bauplan beinhaltet normalerweise die Interna. Bei einer Schnittstelle geht es jedoch nur um das, was außerhalb einer Klasse sichtbar ist ... oder genauer gesagt, um eine Familie von Klassen, die die Schnittstelle implementieren.

Die Schnittstelle besteht aus den Signaturen von Methoden und Werten von Konstanten sowie einem (normalerweise informellen) "Verhaltensvertrag" zwischen Klassen, die die Schnittstelle implementieren, und anderen, die sie verwenden.

7
Stephen C

In der Programmierung definiert eine Schnittstelle, wie das Verhalten eines Objekts aussehen wird, aber es gibt nicht das Verhalten an. Es ist ein Vertrag, der garantiert, dass eine bestimmte Klasse etwas tun kann. 

Betrachten Sie diesen C # -Code hier:

using System;

public interface IGenerate
{
    int Generate();
}

// Dependencies
public class KnownNumber : IGenerate
{
    public int Generate() 
    {
        return 5;
    }   
}

public class SecretNumber : IGenerate
{
    public int Generate()
    {
        return new Random().Next(0, 10);
    }
}

// What you care about
class Game
{
    public Game(IGenerate generator) 
    {
        Console.WriteLine(generator.Generate())
    }
}

new Game(new SecretNumber());
new Game(new KnownNumber());

Die Spielklasse erfordert eine Geheimnummer. Um dies zu testen, möchten Sie die als Geheimzahl verwendete Nummer einfügen (dieses Prinzip wird Inversion of Control genannt).

Die Spieleklasse möchte "aufgeschlossen" darüber sein, was die Zufallszahl tatsächlich erzeugt, daher fragt sie in ihrem Konstruktor nach "irgendetwas, das eine Generate-Methode hat". 

Zunächst legt die Schnittstelle fest, welche Operationen ein Objekt bereitstellt. Es enthält nur, wie es aussieht, aber es ist keine tatsächliche Implementierung angegeben. Dies ist nur die Signatur der Methode. Üblicherweise wird in C # -Schnittstellen ein I ..__ vorangestellt. Die Klassen implementieren nun die IGenerate-Schnittstelle. Das bedeutet, dass der Compiler sicherstellen wird, dass beide über eine Methode verfügen, die ein int zurückgibt und Generate heißt. Das Spiel wird jetzt als zwei verschiedene Objekte bezeichnet, von denen jedes die richtige Schnittstelle implementiert. Andere Klassen würden beim Erstellen des Codes einen Fehler erzeugen.

Hier ist mir die von Ihnen verwendete Blueprint-Analogie aufgefallen:

Eine Klasse wird im Allgemeinen als Blaupause für ein Objekt betrachtet. Ein Interface gibt etwas an, was eine Klasse tun muss, daher könnte man argumentieren, dass es tatsächlich nur ein Entwurf für eine Klasse ist. Da eine Klasse jedoch nicht notwendigerweise ein Interface benötigt, würde ich sagen, dass diese Metapher bricht. Stellen Sie sich eine Schnittstelle als Vertrag vor. Die Klasse, die "unterschreibt", wird gesetzlich verpflichtet (von der Compiler-Polizei durchgesetzt), um die Vertragsbedingungen einzuhalten. Dies bedeutet, dass es das tun muss, was in der Schnittstelle angegeben ist. 

Dies ist alles auf die statisch typisierte Natur einiger OO -Sprachen zurückzuführen, wie dies bei Java oder C # der Fall ist. In Python hingegen wird ein anderer Mechanismus verwendet: 

import random

# Dependencies
class KnownNumber(object):
    def generate(self):
        return 5

class SecretNumber(object):
    def generate(self):
        return random.randint(0,10)

# What you care about
class SecretGame(object):
    def __init__(self, number_generator):
        number = number_generator.generate()
        print number

Hier implementiert keine der Klassen eine Schnittstelle. Python kümmert sich nicht darum, da die SecretGame-Klasse einfach versucht, das übergebene Objekt aufzurufen. Wenn das Objekt eine generate () - Methode hat, ist alles in Ordnung. Wenn nicht: KAPUTT! Dieser Fehler wird nicht zur Kompilierzeit angezeigt, sondern zur Laufzeit, also möglicherweise, wenn das Programm bereits implementiert ist und ausgeführt wird. C # würde Sie benachrichtigen, bevor Sie sich dem näherten. 

Der Grund, warum dieser Mechanismus verwendet wird, ist naiv ausgedrückt, weil in OO Sprachen Funktionen natürlich keine erstklassigen Bürger sind. Wie Sie sehen können, enthalten KnownNumber und SecretNumber JUST die Funktionen zum Generieren einer Nummer. Den Unterricht braucht man eigentlich gar nicht. In Python könnte man sie also einfach wegwerfen und die Funktionen selbst auswählen:

# OO Approach
SecretGame(SecretNumber())
SecretGame(KnownNumber())

# Functional Approach

# Dependencies
class SecretGame(object):
    def __init__(self, generate):
        number =  generate()
        print number

SecretGame(lambda: random.randint(0,10))
SecretGame(lambda: 5)

Ein Lambda ist nur eine Funktion, die "in line, as you go" ..__ deklariert wurde. Ein Delegat ist in C # genau das gleiche:

class Game
{
    public Game(Func<int> generate) 
    {
        Console.WriteLine(generate())
    }
}    

new Game(() => 5);
new Game(() => new Random().Next(0, 10));

Letztere Beispiele sind in Java nicht so möglich, da Java nicht mit Funktionen herumwackeln kann wie die beiden anderen (Python und C #). Dort sind Schnittstellen die einzige Möglichkeit, das Verhalten in av so zu gestalten.

5
cessor

Technisch würde ich eine Schnittstelle als eine Reihe von Möglichkeiten beschreiben (Methoden, Eigenschaften, Zugriffsmethoden ... das Vokabular hängt von der verwendeten Sprache ab), um mit einem Objekt zu interagieren. Wenn ein Objekt eine Schnittstelle unterstützt/implementiert, können Sie alle in der Schnittstelle angegebenen Möglichkeiten für die Interaktion mit diesem Objekt verwenden.

Semantisch könnte eine Schnittstelle Konventionen darüber enthalten, was Sie tun können oder nicht (z. B. die Reihenfolge, in der Sie die Methoden aufrufen können) und darüber, was Sie im Gegenzug über den Status des Objekts annehmen können, wenn Sie wissen, wie Sie damit interagiert haben weit.

4
Ghislain Fourny

schnittstelle ist "welcher Job" eine Methode nicht "wie" . Es ist ein Vertrag . Wie in der Prioritätswarteschlange wissen Sie, was Sie damit tun sollen, aber die zugrunde liegende Implementierung kennen Sie nicht. Die Klasse stimmt zu, niemals Die "Auswirkungen" bestehender Vorgänge zu ändern, und der Client erklärt sich damit einverstanden, die Klasse ausschließlich auf der Grundlage seiner Schnittstelle zu verwenden und jegliche Implementierungsdetails Zu ignorieren.

Layman: "" Denken Sie an eine Universalfernbedienung, die jedes Fernsehgerät steuern kann. Ob es sich um ein altes Röhrenmodell handelt oder ein LCD - oder Plasmabildschirm verwendet wird. Sie drücken dann 2 5, dann Enter, und auf einem der Bildschirme wird Kanal 25 angezeigt, .__, obwohl der Mechanismus, der dies ermöglicht, je nach zugrunde liegender Technologie sehr unterschiedlich ist.

3
Muddassir Zafar

Persönlich sehe ich eine Schnittstelle wie eine Vorlage. Wenn eine Schnittstelle die Definition für die Methoden foo () und bar () enthält, wissen Sie, dass jede Klasse, die diese Schnittstelle verwendet, die Methoden foo () und bar () hat.

2
Thomas Winsnes

Lassen Sie uns einen Mann (Benutzer oder ein Objekt) betrachten, der etwas Arbeit erledigt. Er wird sich mit einem mittleren Mann (Interface) in Verbindung setzen, der einen Vertrag mit den Unternehmen hat (Objekte der realen Welt, die mit implementierten Klassen erstellt wurden). Wenige Arten von Werken werden von ihm definiert, die von den Unternehmen umgesetzt werden und Ergebnisse liefern. Jedes Unternehmen wird die Arbeit auf seine eigene Weise umsetzen, aber das Ergebnis wird gleich bleiben. Wie dieser Benutzer wird seine Arbeit über eine einzige Schnittstelle erledigt ... Ich denke, Interface wird als sichtbarer Teil der Systeme mit wenigen Befehlen fungieren, die intern durch die implementierenden inneren Subsysteme definiert werden.

2
Arun N

Meiner Meinung nach hat Schnittstelle eine breitere Bedeutung als die, die üblicherweise in Java damit verbunden ist. Ich würde "Schnittstelle" als eine Menge verfügbarer Operationen mit einigen allgemeinen Funktionen definieren, die die Steuerung/Überwachung eines Moduls ermöglichen. 

In dieser Definition versuche ich, sowohl programmatische Schnittstellen, bei denen der Client ein Modul ist, als auch Benutzeroberflächen (z. B. GUI) abzudecken.

Wie bereits erwähnt, hat eine Schnittstelle immer einen Vertrag, was die Ein- und Ausgänge angeht. Die Benutzeroberfläche verspricht nichts über das "Wie" der Operationen. Sie garantiert nur bestimmte Eigenschaften des Ergebnisses, wenn der aktuelle Status, der ausgewählte Vorgang und seine Parameter festgelegt sind.

1
Eyal Schneider

Wie oben sind Synonyme für "Vertrag" und "Protokoll" angemessen. 

Die Schnittstelle umfasst die Methoden und Eigenschaften, von denen Sie erwarten können, dass sie von einer Klasse verfügbar gemacht werden.

Wenn also eine Klasse Cheetos Bag die Chip Bag-Schnittstelle implementiert, sollten Sie erwarten, dass sich Cheetos Bag genau wie jeder andere Chip Bag verhält. (D. H. Die .attemptToOpenWithoutSpillingEverywhere()-Methode verfügbar machen usw.)

1
wlangstroth

Eine Schnittstelle trennt Operationen für eine Klasse von der Implementierung innerhalb. Daher können einige Implementierungen viele Schnittstellen bereitstellen.

Die Leute beschreiben es normalerweise als "Vertrag" für das, was in den Methoden der Klasse verfügbar sein muss.

Es ist absolut keine Blaupause, da dies auch die Implementierung bestimmen würde. Eine vollständige Klassendefinition könnte man als Blaupause bezeichnen.

1
Puppy

Eine Schnittstelle definiert, was eine Klasse, die von ihr erbt, implementieren muss. Auf diese Weise können mehrere Klassen von einer Schnittstelle erben, und aufgrund dieser Inhertikanz können Sie dies tun

  • vergewissern Sie sich, dass alle Mitglieder der Schnittstelle in der abgeleiteten Klasse implementiert sind (auch wenn nur eine Ausnahme ausgelöst wird).
  • Entfernen Sie die Klasse selbst vom Aufrufer (werfen Sie eine Instanz einer Klasse in die Schnittstelle und interagieren Sie mit ihr, ohne zu wissen, was die tatsächlich abgeleitete Klasse ist).

weitere Informationen finden Sie hier http://msdn.Microsoft.com/de-de/library/ms173156.aspx

1
Greg Olmstead

Konventionelle Definition - Eine Schnittstelle ist ein Vertrag, der die Methoden angibt, die von der implementierenden Klasse implementiert werden müssen.

Die Definition der Schnittstelle hat sich im Laufe der Zeit geändert. Denken Sie, dass das Interface nur Methodendeklarationen hat? Was ist mit statischen finalen Variablen und mit Standarddefinitionen nach Java 5?.

Java wurde aufgrund des Diamond-Problems mit Multiple Inheritance in Java eingeführt. Dies ist genau das, was sie tatsächlich vorhaben.

Schnittstellen sind die Konstrukte, die erstellt wurden, um das Problem der Mehrfachvererbung zu überwinden, und können abstrakte Methoden, Standarddefinitionen und statische letzte Variablen enthalten. 

http://www.quora.com/Warum-stimmt-Java-flache- statische-endliche-Variablen-inne_Interfaces-wenn-sie-nur-nur-intendierte-zu-ich-Verträge

0
Vivek Vermani

Eine Grenze, über die zwei Systeme kommunizieren.

Schnittstellen sind, wie einige OO -Sprachen ad hoc-Polymorphismus erreichen. Ad-hoc-Polymorphismus ist einfach eine Funktion mit denselben Namen, die auf verschiedene Typen angewendet werden.

0
cheecheeo

Kurz gesagt: Das grundlegende Problem, das eine Schnittstelle zu lösen versucht, besteht darin, die Verwendung von etwas von der Implementierung zu trennen. Aber Sie sollten das Interface betrachten ist kein Vertrag . Lesen Sie mehr hier .