Frage

Wie unterscheiden sich Konzepte (dh die kürzlich aus dem C ++ 0x Standard gesunken) von Schnittstellen in Sprachen wie Java?

War es hilfreich?

Lösung

Konzepte beziehen sich auf den Kompilierzeitpolymorphismus, dh parametrischen generischen Code. Schnittstellen sind für den Laufzeitpolymorphismus.

Sie müssen eine Schnittstelle implementieren, während Sie ein Konzept implementieren. Der Unterschied besteht darin, dass Sie nicht ausdrücklich sagen müssen, dass Sie ein Konzept implementieren. Wenn die erforderliche Schnittstelle übereinstimmt, sind keine Probleme. Bei Schnittstellen, auch wenn Sie implementiert sind alle Bei den erforderlichen Funktionen müssen Sie die Erregbarkeit sagen, dass Sie es implementieren!


Ich werde versuchen, meine Antwort zu klären :)

Stellen Sie sich vor, Sie entwerfen einen Container, der jeden Typ akzeptiert, der das hat Größe Mitgliedsfunktion. Wir formalisieren das Konzept und nennen es Hassize, natürlich sollten wir es an anderer Stelle definieren, aber dies ist ein Beispiel nicht mehr.

template <class HasSize>
class Container
{
  HasSize[10]; // just an example don't take it seriously :)
 // elements MUST have size member function!
};

Stellen Sie sich dann vor, wir erstellen eine Instanz unserer Container Und wir nennen es Myshapes, Form ist eine Basisklasse und definiert die Größe Mitgliedsfunktion. Quadrat und Kreis sind nur Kinder davon. Wenn die Form die Größe nicht definierte, sollte ein Fehler erzeugt werden.

Container<Shape> myShapes;

if(/* some condition*/)
    myShapes.add(Square());
else
    myShapes.add(Circle());

Ich hoffe, Sie sehen, dass diese Form überprüft werden kann Hassize bei Zeit kompilieren, Es gibt keinen Grund, die Überprüfung zur Laufzeit durchzuführen. Im Gegensatz zu den Elementen von Myshapes, Wir könnten eine Funktion definieren, die sie manipuliert:

void doSomething(Shape* shape)
{
    if(/* shape is a Circle*/)
        // cast then do something with the circle.
    else if( /* shape is a Square */)
        // cast then do something with the square.
}

In dieser Funktion können Sie nicht wissen, was bis zur Laufzeit ein Kreis oder ein Quadrat übergeben wird!

Sie sind zwei Tools für einen ähnlichen Job, obwohl die Schnittstelle-oder wie Sie sie nennen-fast die gleiche Aufgabe von Konzepten zur Laufzeit erledigen können, aber Sie verlieren alle Vorteile der Kompilierungszeitprüfung und -optimierung!

Andere Tipps

Konzepte sind Likes -Typen (Klassen) für Vorlagen: Es gilt nur für die generische Programmierseite der Sprache.

Auf diese Weise soll es nicht die Schnittstellenklassen ersetzen (vorausgesetzt, Sie bedeuten abstrakte Klassen oder andere C ++ - äquivalente Implementierung von C #- oder Java -Schnittstellen), da es nur dazu bestimmt ist, Typen zu überprüfen, die in Vorlagenparametern verwendet werden, um den spezifischen Anforderungen zu entsprechen. Die Typprüfung erfolgt nur zur Kompilierzeit wie alle Vorlagencodegenerierung und während die Schnittstellenklassen Auswirkungen auf die Laufzeitausführung haben.

Es ist mehr oder weniger ein Unterschied in der Sichtweise. Während eine Schnittstelle (wie in C#) ähnlich wie eine Basisklasse angegeben ist, kann auch automatisch ein Konzept angepasst werden (ähnlich wie bei der Entenzyung in Python). Es ist immer noch unklar, auf welcher Stufe C ++ automatische Konzeptabgleiche unterstützen wird, was einer der Gründe ist, warum sie es fallen ließen.

Konzepte sind implizite Schnittstellen. In C# oder Java muss eine Klasse eine Schnittstelle ausdrücklich implementieren, während in C ++ Teil eines Konzepts nur so lange ist, wie sie den Einschränkungen des Konzepts entspricht.

Der Grund, warum Sie Konzepte in C ++ und nicht in Java oder C# sehen, ist, dass C ++ nicht wirklich "Schnittstellen" hat. Stattdessen können Sie eine Schnittstelle mit mehreren Vererbung und abstrakten, unter anderem basischen Basisklassen simulieren. Diese sind ein bisschen ein Hack und können Kopfschmerzen haben, mit denen man arbeiten kann (z. B. virtuelle Erbe und Das Diamantproblem). Schnittstellen spielen eine entscheidende Rolle im OOP und im Polymorphismus, und diese Rolle wurde in C ++ bisher nicht angemessen erfüllt. Konzepte sind die Antwort auf dieses Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top