10

Dies ist noch keine Frage über den Unterschied zwischen abstrakten Klassen und Interfaces, also denken Sie bitte zweimal darüber nach, bevor Sie abstimmen, um es zu schließen.Sind Schnittstellen redundant mit Mehrfachvererbung?

Ich bin mir bewusst, dass Schnittstellen in diesen OOP-Sprachen, die keine Mehrfachvererbung unterstützen - wie C# und Java - essentiell sind. Aber was ist mit diesen mit Mehrfachvererbung? Wäre ein Konzept der Schnittstelle (als spezifisches Sprachmerkmal) redundant in einer Sprache mit Mehrfachvererbung? Ich denke, dass OOP "Vertrag" zwischen Klassen kann mithilfe von abstrakten Klassen erstellt werden.

Oder, um es etwas expliziter zu sagen, sind Schnittstellen in C# und Java nur eine Konsequenz der Tatsache, dass sie keine Mehrfachvererbung unterstützen?

+0

Nicht sicher, was Sie hier fischen: wie Bozho sagt, Interfaces sind eine Sprachebene Hedge gegen jemand Verhalten einer Klasse unerwartet ändern, indem eine Implementierung für Methoden, die abstrakt sein. –

+0

Die Frage ist, ob MI-Sprachen brauchen diese Hecke wirklich oder nicht (siehe zum Beispiel Ken's Kommentare unten.) Ich habe auch gehofft, eine andere Meinung von außerhalb von Java/C# -Camps zu bekommen. " –

Antwort

7

... Der Mangel an Mehrfachvererbung uns gezwungen, das Konzept der Schnittstellen hinzuzufügen ...

Also ja, ich glaube, Schnittstellen sind bei mehrfacher Vererbung redundant. Sie können reine abstrakte Basisklassen in einer Sprache verwenden, die Mehrfachvererbung oder -mischungen unterstützt.

Das heißt, ich bin ziemlich glücklich mit Single Erbschaft die meiste Zeit. Eric Lippert macht früher im selben Band (S. 10) den Punkt, dass die Wahl der Einzelvererbung "... auf einen Schlag viele der komplizierten Eckfälle beseitigt ..."

8

Überhaupt nicht. Schnittstellen definieren Verträge ohne Angabe von Implementierungen.

So werden sie benötigt, auch wenn mehrere Vererbung vorhanden ist - Vererbung ist über die Implementierung.

Technisch können Sie eine abstrakte Klasse in mehrfacher Vererbung verwenden, um eine Schnittstelle zu simulieren. Aber so kann man geneigt sein, dort einige Implementierungen zu schreiben, was zu großen Fehlern führen wird.

+1

Ich verstehe es nicht. Wenn es dokumentiert ist, dass es ist und sollte Bleiben Sie eine Schnittstelle, warum wäre man geneigt, eine Implementierung hinzuzufügen? Wenn die Behauptung ist, dass es heute möglich ist, etwas semantisch korrekt zu machen, und dann jemand es später so verändern könnte, dass es ein großes Durcheinander verursacht, ist das nicht wahr Jedes Sprachmerkmal? – Ken

+0

Bedeutet es dann, dass zum Beispiel C++ leidet, keine Schnittstellen zu haben? –

+2

über C++ - es ist subjektiv. Ich habe keine Erfahrung damit zu sagen, ob es leidet. @Ken - je schwieriger es ist, etwas zu missbrauchen, desto besser. – Bozho

1

Interfaces sind auf Mehrfachvererbung zu bevorzugen, da Verkapselung Vererbung verletzt nach „Effective Java“ Punkt 16, Favor composition over inheritance.

+0

Warum unterdrücken Sie dann nicht die einzelne Vererbung? Das Argument macht keinen Sinn. – curiousguy

8

auf den Test Hängt für Redundanz.

Wenn der Test ist "kann diese Aufgabe ohne die Sprachfunktion erreicht werden", dann sind Klassen selbst redundant, weil es Turing konkurrierende Sprachen ohne Klassen gibt. Oder von einer technischen Basis aus ist alles, was über den Maschinencode hinausgeht, überflüssig.

Realistisch gesehen ist der Test eine subtilere Kombination aus Syntax und Semantik. Eine Sache ist redundant, wenn sie weder die Syntax noch die Semantik einer Sprache für eine vernünftige Anzahl von Verwendungen verbessert.

In Sprachen, die die Unterscheidung machen, erklärt die Unterstützung einer Schnittstelle, dass eine Klasse weiß, wie man sich auf eine bestimmte Art und Weise verständigt. Das Erben von einer anderen Klasse importiert (und erweitert oder modifiziert wahrscheinlich) die Funktionalität einer anderen Klasse.

Da die beiden Aufgaben nicht logisch gleichwertig sind, behaupte ich, dass Schnittstellen nicht redundant sind. Die Unterscheidung zwischen den beiden verbessert die Semantik für eine große Anzahl von Programmen, da sie genauer die Absicht des Programmierers anzeigen kann.

+0

Die beiden Aufgaben sind nicht gleichwertig, aber sie sind zweifellos verwandt. Eine Klasse zu erben setzt voraus, dass man weiß, wie man sich unterhält, nicht wahr? –

+0

Ja - das größere schließt das kleinere ein. Aber ich denke, dass die Fähigkeit, zwischen der Frage zu unterscheiden, wo ein Autor einen Dialog erwartet und wo der Autor von Ihnen erwartet, dass er eine begabte Funktionalität besitzt, in einem komplizierten System ausreichend ist, damit die Schnittstellen nicht redundant sind. – Tommy

2

Nun, wenn Sie diesen Weg gehen, könnten Sie sagen, dass C und C++, C# und andere High-Level-Sprachen überflüssig sind, weil Sie alles, was Sie Assembly verwenden wollen, codieren können. Sicher, Sie brauchen nicht diese High-Level-Sprachen, aber sie helfen ... eine Menge.

Alle diese Sprachen werden mit verschiedenen Dienstprogrammen geliefert. Für einige von ihnen ist das Schnittstellenkonzept eines dieser Hilfsmittel. Also, ja, in C++ konnte man ohne Implementierung Interfaces und Sticks mit abstrakten Klassen vermeiden.

In der Tat, wenn Sie Microsoft COM mit C programmieren möchten, obwohl C das Interface-Konzept nicht kennt, können Sie es tun, weil alle.h-Dateien definieren Schnittstellen auf diese Weise:

#if defined(__cplusplus) && !defined(CINTERFACE) 
    MIDL_INTERFACE("ABCDE000-0000-0000-0000-000000000000") 
    IMyInterface : public IUnknown 
    { 
    ... 
    } 
#else /* C style interface */ 
    typedef struct IMyInterfaceVtbl 
    { 
     BEGIN_INTERFACE 

     HRESULT (STDMETHODCALLTYPE *SomMethod)(... ...); 

     END_INTERFACE 
    } IMyInterfaceVtbl; 

    interface IMyInterface 
    { 
     CONST_VTBL struct IMyInterfaceVtbl *lpVtbl; 
    }; 
#endif 

Irgendeine Art von anderen syntaktischen Zucker ...

Und es ist wahr, dass zu sagen, in C#, wenn ich nicht das Interface-Konzept hatte, ich weiß nicht, wie könnte ich wirklich codieren :). In C# brauchen wir unbedingt Schnittstellen.

+0

Aber C# hat keinen MI, oder? Beachten Sie, dass ich den Nutzen von Schnittstellen überhaupt nicht in Frage stelle. –

+0

Absolut, C# hat keinen MI. Die ganze .NET CLR hat es nicht, aber einige Sprachen "emulieren" es, wie Eiffel: http://msdn.microsoft.com/en-us/library/ms973898.aspx –

4

Sind Schnittstellen in C# und Java nur eine Folge der Tatsache, dass sie keine Mehrfachvererbung unterstützen ?

Ja, das sind sie. Zumindest in Java. Als einfache Sprache wollten die Entwickler von Java eine Sprache, die die meisten Entwickler ohne umfangreiches Training verstehen konnten. Zu diesem Zweck arbeiteten sie daran, die Sprache C++ so ähnlich wie möglich (vertraut) zu machen, ohne die unnötige Komplexität von C++ (einfach) zu übernehmen. Die Entwickler von Java entschieden sich für die Vererbung mehrerer Schnittstellen durch die Verwendung von Schnittstellen, eine Idee, die aus den Protokollen von Objective C übernommen wurde. See there for details

Und ja, ich glaube, dass wie in C++ Schnittstellen redundant sind, wenn Sie mehrere Vererbung haben. Wenn Sie eine leistungsfähigere Funktion haben, warum sollten Sie die weniger behalten?

5

Es gibt Sprachen, die die Mehrfachvererbung unterstützen, die kein paralleles Konzept zur Java-Schnittstelle enthalten. Eiffel ist einer von ihnen. Bertrand Meyer sah die Notwendigkeit für sie nicht, da es die Möglichkeit gab, eine aufgeschobene Klasse (was die meisten Leute eine abstrakte Klasse nennen) mit einem ausgefüllten Vertrag zu definieren.

Das Fehlen der Mehrfachvererbung kann zu Situationen führen, in denen ein Programmierer eine Dienstprogrammklasse oder dergleichen erstellen muss, um das Schreiben von doppeltem Code in Objekten zu verhindern, die die gleiche Schnittstelle implementieren.

Es könnte sein, dass die Anwesenheit des Vertrags einen wesentlichen Beitrag zum Fehlen eines vollständig implementationsfreien Konzeptes einer Schnittstelle ... gab. Verträge sind schwerer zu schreiben, ohne dass einige Implementierungsdetails getestet werden müssen.

Also, technische Schnittstellen sind redundant in einer Sprache, die MI unterstützt.

Aber wie andere darauf hingewiesen haben ... mehrere Vererbung kann eine sehr knifflige Sache sein, richtig zu verwenden, die ganze Zeit. Ich weiß, ich konnte nicht ... und ich arbeitete für Meyer, als er Object Oriented Software Construction, 2. Auflage, entwarf.

+1

_ "Es gibt Sprachen, die mehrfache Vererbung unterstützen die kein paralleles Konzept zur Java-Schnittstelle enthalten. "_ Kennst du ein Beispiel für das Gegenteil - dh MI-Sprache, die ein eigenes Schnittstellenkonzept hat? –