Heim > Backend-Entwicklung > C++ > Objektorientierte Programmierung in C? Implementierung von Schnittstellen von Grund auf neu

Objektorientierte Programmierung in C? Implementierung von Schnittstellen von Grund auf neu

Robert Michael Kim
Freigeben: 2025-03-03 17:47:45
Original
476 Leute haben es durchsucht

c objektorientierte Programmierung: Implementieren von Schnittstellen von Grundkämpfer

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#.

und

sind konkrete Klassen, die die

-Krinne implementieren, indem es Implementierungen für
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_;
};
Nach dem Login kopieren
Nach dem Login kopieren
und

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()

Schließlich ist die Durchsetzung unterschiedlich. Java und C# setzen die Interface -Implementierung zur Kompilierung durch. C erzwingt es hauptsächlich zur Kompilierungszeit, aber Laufzeitfehler können auftreten, wenn eine abgeleitete Klasse nicht alle reinen virtuellen Funktionen korrekt implementiert (was zu undefiniertem Verhalten führt). In C wird es durch virtuelle Funktionen und Zeiger/Verweise auf Basisklassen erreicht. Wenn Sie abstrakte Klassen als Schnittstellen verwenden, können Sie mit Polymorphismus Objekte verschiedener abgeleiteter Klassen durch einen Zeiger oder eine Bezugnahme auf die Basisklasse (die abstrakte Klasse) gleichmäßig behandeln.

.
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_;
};
Nach dem Login kopieren
Nach dem Login kopieren

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:

1. Strategiemuster:

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage