Maison >développement back-end >C++ >Programmation orientée objet en C? Implémentation d'interfaces à partir de zéro
C n'a pas d'interfaces de la même manière Java ou C #. Java et C # ont des mots clés explicites interface
qui définissent des contrats spécifiant les signatures de la méthode sans fournir d'implémentations. C atteint des fonctionnalités similaires, mais via un mécanisme différent: Classes abstraites . Une classe abstraite déclare au moins une fonction virtuelle pure (une fonction déclarée avec = 0
). Une fonction virtuelle pure n'a pas de définition dans la classe abstraite; Il spécifie uniquement la signature de la fonction. Toute classe qui hérite d'une classe abstraite doit fournir des implémentations pour toutes les fonctions virtuelles pures, sinon, elle reste abstraite et ne peut pas être instanciée. Cela applique efficacement le contrat défini par la classe abstrait, reflétant le comportement des interfaces dans Java ou C #.
Par exemple:
<code class="cpp">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_; };</code>
Dans cet exemple, Shape
agit comme une interface. Circle
et Rectangle
sont des classes concrètes qui implémentent l'interface Shape
en fournissant des implémentations pour getArea()
et draw()
.
La principale différence se trouve dans le mécanisme utilisé. Java et C # utilisent des mots clés explicites interface
, permettant à une classe d'implémenter plusieurs interfaces indépendamment. C utilise des classes abstraites et une classe ne peut hériter que directement d'une classe de base (bien que l'héritage multiple soit possible grâce à l'héritage virtuel, ce qui ajoute de la complexité). Cela signifie que la réalisation de l'équivalent de multiples interfaces en C nécessite une approche différente, impliquant souvent un héritage ou une composition multiple.
Une autre différence est que les interfaces Java et C # ne peuvent contenir que des signatures de méthode (et des constantes), tandis que les classes abstraites peuvent également contenir des variables de membres et des fonctions virtuelles non purs (avec des implémentations). Cela offre plus de flexibilité en C, mais cela peut également conduire à une séparation moins claire de l'interface et de la mise en œuvre.
Enfin, l'application est différente. Java et C # Implémentation de l'interface renforcent au moment de la compilation. C l'applique principalement au moment de la compilation, mais les erreurs d'exécution peuvent se produire si une classe dérivée n'implémente pas correctement toutes les fonctions virtuelles pures (conduisant à un comportement non défini).
Le polymorphisme est la capacité d'un objet à prendre en charge de nombreuses formes. En C, il est réalisé via des fonctions virtuelles et des pointeurs / références aux classes de base. Lorsque vous utilisez des classes abstraites comme interfaces, le polymorphisme vous permet de traiter uniformément des objets de différentes classes dérivés via un pointeur ou une référence à la classe de base (la classe abstraite).
<code class="cpp">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_; };</code>
Ce code démontre le polymorphisme. Même si shape1
et shape2
sont des pointeurs vers Shape
, la fonction getArea()
correcte (soit à partir de Circle
ou Rectangle
) est appelée à l'exécution en raison de la répartition de la fonction virtuelle. Ceci est crucial pour le code flexible et maintenable.
Plusieurs modèles de conception reposent fortement sur le concept d'interfaces (représenté par des classes abstraites en C). Voici deux exemples:
1. Modèle de stratégie: Ce modèle définit une famille d'algorithmes, résume chacun comme un objet et les rend interchangeables. Une classe abstraite définit l'interface de ces algorithmes, et les classes concrètes implémentent des algorithmes spécifiques.
<code class="cpp">Shape* shape1 = new Circle(5); Shape* shape2 = new Rectangle(4, 6); std::cout << "Circle Area: " << shape1->getArea() << std::endl; std::cout << "Rectangle Area: " << shape2->getArea() << std::endl; delete shape1; delete shape2;</code>
2. Modèle d'usine: Ce modèle définit une interface pour créer un objet, mais permet de décider de la classe à instanciation. Une classe abstraite (ou parfois plusieurs) définit l'interface pour la création d'objets, et les usines concrètes implémentent la création de types d'objets spécifiques.
<code class="cpp">class SortingAlgorithm { public: virtual void sort(std::vector<int>& data) = 0; }; class BubbleSort : public SortingAlgorithm { public: void sort(std::vector<int>& data) override { /* Bubble sort implementation */ } }; class QuickSort : public SortingAlgorithm { public: void sort(std::vector<int>& data) override { /* Quick sort implementation */ } };</code>
Ces exemples montrent comment les classes abstraites en C servent effectivement le but des interfaces, permettant de puissants modèles de conception qui favorisent la flexibilité, la maintenabilité et l'extensibilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!