c haben keine Schnittstellen auf die gleiche Weise wie Java oder C#. Java und C# haben explizite interface
Schlüsselwörter, die Verträge definieren, die Methodensignaturen ohne Implementierungen angeben. C erreicht ähnliche Funktionen, aber durch einen anderen Mechanismus: abstrakte Klassen . Eine abstrakte Klasse erklärt mindestens eine reine virtuelle Funktion (eine mit = 0
deklarierte Funktion). Eine reine virtuelle Funktion hat keine Definition innerhalb der abstrakten Klasse; Es gibt nur die Signatur der Funktion an. Jede Klasse, die eine abstrakte Klasse erbt, muss Implementierungen für alle reinen virtuellen Funktionen bereitstellen, ansonsten bleibt sie abstrakt und kann nicht instanziiert werden. Dies erzwingt den von der abstrakten Klasse definierten Vertrag effektiv und spiegelt das Verhalten von Schnittstellen in Java oder C#.
sind konkrete Klassen, die die
-Krinne implementieren, indem es Implementierungen fürclass Shape { public: virtual double getArea() = 0; // Pure virtual function - makes Shape abstract virtual void draw() = 0; // Another pure virtual function }; class Circle : public Shape { public: Circle(double radius) : radius_(radius) {} double getArea() override { return 3.14159 * radius_ * radius_; } void draw() override { /* Implementation to draw a circle */ } private: double radius_; }; class Rectangle : public Shape { public: Rectangle(double width, double height) : width_(width), height_(height) {} double getArea() override { return width_ * height_; } void draw() override { /* Implementation to draw a rectangle */ } private: double width_; double height_; };
Shape
Circle
Schlüsselunterschiede in der Schnittstelleimplementierung bereitstellen: C gegen Java/C Rectangle
Shape
Der primäre Unterschied liegt in dem verwendeten Mechanismus. Java und C# verwenden explizite getArea()
Schlüsselwörter, sodass eine Klasse mehrere Schnittstellen unabhängig implementieren kann. C verwendet abstrakte Klassen, und eine Klasse kann nur direkt von einer Basisklasse von einer Basisklasse erben (obwohl mehrere Vererbung durch virtuelle Vererbung möglich ist, was die Komplexität ergibt). Dies bedeutet, dass das Erreichen des Äquivalents mehrerer Schnittstellen in C einen anderen Ansatz erfordert, der häufig mehrere Vererbung oder Zusammensetzung beinhaltet. Dies bietet mehr Flexibilität in C, kann jedoch auch zu einer geringeren eindeutigen Trennung von Schnittstelle und Implementierung führen. draw()
class Shape { public: virtual double getArea() = 0; // Pure virtual function - makes Shape abstract virtual void draw() = 0; // Another pure virtual function }; class Circle : public Shape { public: Circle(double radius) : radius_(radius) {} double getArea() override { return 3.14159 * radius_ * radius_; } void draw() override { /* Implementation to draw a circle */ } private: double radius_; }; class Rectangle : public Shape { public: Rectangle(double width, double height) : width_(width), height_(height) {} double getArea() override { return width_ * height_; } void draw() override { /* Implementation to draw a rectangle */ } private: double width_; double height_; };
Dieser Code zeigt Polymorphismus. Obwohl shape1
und shape2
Zeiger auf Shape
sind, wird die korrekte getArea()
-Funktion (entweder aus Circle
oder Rectangle
) zur Laufzeit aufgrund des Versands der virtuellen Funktion aufgerufen. Dies ist entscheidend für flexible und wartbare Code. Hier sind zwei Beispiele:
Dieses Muster definiert eine Familie von Algorithmen, verkaps jeden als Objekt und macht sie austauschbar. Eine abstrakte Klasse definiert die Schnittstelle für diese Algorithmen, und konkrete Klassen implementieren spezifische Algorithmen.
2. Fabrikmuster:
Dieses Muster definiert eine Schnittstelle zum Erstellen eines Objekts, lässt jedoch Unterklassen entscheiden, welche Klasse sie instanziieren soll. Eine abstrakte Klasse (oder manchmal mehrere) definiert die Schnittstelle zum Erstellen von Objekten, und konkrete Fabriken implementieren die Erstellung spezifischer Objekttypen.Das obige ist der detaillierte Inhalt vonObjektorientierte Programmierung in C? Implementierung von Schnittstellen von Grund auf neu. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!