web-dev-qa-db-fra.com

Le langage de programmation C est-il orienté objet?

Je parlais de C et de C++ avec un collègue. Il a affirmé que C était orienté objet, mais j'ai affirmé que ce n'était pas le cas. Je sais que vous pouvez faire des choses orientées objet en C, mais C++ est un vrai langage orienté objet. 

Quelles sont vos pensées?

En outre, cela a déclenché une discussion sur qui décide ce que signifie être orienté objet et qu'il est difficile de dire ce que signifie réellement orienté objet. Que pensez-vous de ça?

37
Brian T Hannan

Si par "C est orienté objet?" vous voulez dire "C est conçu avec des installations spécifiquement pour supporter la programmation orientée objet?" alors, non, C n'est clairement pas orienté objet.

59
James McNellis

Vous pouvez programmer dans un style orienté objet dans plus ou moins n'importe quelle langue. (Je pense que le polymorphisme d'exécution - c'est-à-dire les méthodes virtuelles - nécessite un langage qui prend en charge les pointeurs de fonction.)

Voici quelques exemples: 

18
Tim Robinson

C n'est pas orienté objet. C’était l’objet de la ++

En ce qui concerne ce qui est nécessaire pour être orienté objet: check wikipedia .

Personnellement, si elle prend en charge l'héritage, l'encapsulation et le polymorphisme, alors c'est votre intérêt. Une autre clé est que les mots-clés de Nice, tels que classe et objet, ont tendance à aider ...

Exemples de langages orientés objet réels (non concluants): Smalltalk, Java, C #, Python, Ruby, C++.

En outre, il est possible d'avoir des extensions pour fournir OO des fonctionnalités telles que PHP, Perl, VB (pas .Net), ...

10
NotMe

Les vrais programmeurs peuvent écrire du code orienté objet dans TOUT langage.

Mais non, C n'est pas un langage «orienté objet». Il n'a pas de concept de classes, d'objets, de polymorphisme, d'héritage.

9
Roddy

La confusion peut être que C peut être utilisé pour implémenter des concepts orientés objet tels que polymorphisme, encapsulation, etc., ce qui peut amener votre ami à croire que C est orienté objet. Le problème est que pour être considéré comme un langage de programmation orienté objet, ces fonctionnalités doivent être intégrées au langage. Ce qu'ils ne sont pas.

3
Graphics Noob

C n’est pas un langage O-O sous aucune définition de "O-O" et "langage".

Il est assez facile d'utiliser C comme langage d'implémentation pour un composant qui fournit une API OO à ses clients. Le système X Windows est essentiellement un système O-O à héritage unique vu de son API, mais un fouillis de C lors de la visualisation de son implémentation.

3
Bill Torcaso
  1. C n’est pas orienté objet au sens strict, car il n’a pas de capacité orientée objet prise en charge par la syntaxe intégrée telle que la classe, l’héritage, etc.

Mais si vous connaissez le truc, vous pouvez facilement y ajouter une fonctionnalité orientée objet en utilisant simplement struct, un pointeur de fonction et un pointeur automatique. DirectFB est une telle bibliothèque C écrite de manière orientée objet. La mauvaise chose est qu’elle est plus sujette aux erreurs car elle n’est pas régie par la syntaxe et la vérification du type de compilation. Il est basé sur la convention de codage à la place.

par exemple.

  IDirectFB/*a typedef of a struct*/ *dfb = NULL;
  IDirectFBSurface/*another typedef of a struct*/ *primary = NULL;
  DirectFBCreate (&dfb); /*factory method to create a struct (e.g. dfb) with 
                         pointers to function and data. This struct is 
                         like an object/instance of a class in a language with build-in 
                         syntax support for object oriented capability  */
  dfb->SetCooperativeLevel/*function pointer*/ 
          (dfb/*self pointer to the object dfb*/, 
           DFSCL_FULLSCREEN);
  dsc.flags = DSDESC_CAPS;
  dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
  dfb->CreateSurface/*function pointer, also a factory method 
                       to create another object/instance */
          ( dfb/*self pointer to the object dfb*/, 
            &dsc, 
            &primary/*another struct work as object of another class created*/ );
  primary->GetSize/*function pointer*/ 
              (primary/*self pointer to the object primary*/, 
               &screen_width, 
               &screen_height);

2 C++ est orienté objet car il prend en charge de manière intégrée les fonctionnalités orientées objet telles que la classe et l'héritage. Mais certains arguent que ce n'est pas un langage orienté objet complet ou pur, car il autorise la syntaxe C (syntaxe de programmation structurelle). Je me souviens également que C++ manque de quelques fonctionnalités orientées objet, mais que je ne m'en souviens pas exactement.

3
ttchong

À moins que votre ami ne parle d'Objectif C (un OO sur-ensemble de C), alors non, le langage C n'est pas un OO. Vous pouvez implémenter les concepts OO à l'aide de C (c'est ce que faisait l'ancien compilateur cfront C++, il traduisait C++ en C), mais cela ne fait pas de C un langage OO car il ne propose pas spécifiquement de support pour techniques OO standard comme le polymorphisme ou l’encapsulation.

Oui, vous pouvez écrire un style de logiciel OO en C, en particulier avec une utilisation généreuse (abstraite) de macros, mais en tant que personne ayant vu les résultats de certaines de ces tentatives, je vous suggère fortement d'utiliser un langage mieux adapté. .

1
Timo Geusch

Les vrais programmeurs peuvent écrire du code orienté objet dans TOUT langage.

Je ai vu Cobol orienté objet. Cobol qui appelle Cobol. Voulez-vous appeler ces programmeurs "Real"?

1
newbie007

C n’est pas un langage orienté objet . C est un langage généraliste, impératif, supportant la programmation structurée . Parce que C n’est pas orienté objet, le C++ a donc été créé pour que les fonctions de POO et OOP est un modèle de langage de programmation organisé autour d’objets .. Un langage permettant la fonctionnalité POO doit implémenter certains principes de POO. Peu d’entre eux sont Héritage, Polymorphisme, Abstraction, Encapsulation. 

1

Réponse peut être oui ou non , en fonction de:

  • si vous demandez "C est un langage orienté objet?", la réponse est "non" car il n'a pas de constructeurs orientés objet, de mots-clés, de sémantique, etc.

  • si vous avez l'intention de "puis-je comprendre OOP en C?", la réponse est oui, car OOP n’est pas seulement une exigence d’un langage, mais aussi un moyen de "penser", une approche de la programmation, avant de toucher à un langage ou à un autre. Cependant, la mise en œuvre de OOP en C (ou de tout autre langage non conçu nativement pour être OOP) sera sûrement "forcée" et beaucoup plus difficile à gérer que tout autre langage OOP, aussi certaines limitations seront attendu.

0
bzimage

Non, ce n'est pas votre ami qui a tort.

0
Ed S.