Est-ce que le fichier C a une interface orientée object?

Est-ce que le type de FILE utilisé par les fonctions C standard fopen , etc. a une interface orientée object?

Je cherche des opinions avec un raisonnement plutôt qu’une réponse absolue, car les définitions de OO varient selon les personnes que vous demandez. Quels sont les concepts OO importants rencontrés ou non rencontrés?

En réponse au commentaire de JustJeff ci-dessous, je ne demande pas si C est un langage OO, ni si C (facilement ou non) permet la programmation OO. (N’est-ce pas une question distincte?)

D’un sharepoint vue académique, les fichiers réels sont certainement des objects . Ils ont des atsortingbuts et vous pouvez effectuer des actions sur eux. Cela ne veut pas dire que FILE est une classe , il suffit de dire qu’il y a différents degrés de OO-ness à considérer.

Le problème avec le fait d’essayer de dire que l’interface stdio FILE est qualifiée d’OO, cependant, est que l’interface stdio FILE ne représente pas très bien l’objectivité du fichier. Vous pouvez utiliser les fichiers sous le vieux C clair de manière OO, mais vous perdez évidemment la clarté syntaxique offerte par Java ou C ++.

Il faudrait probablement append que si vous ne pouvez pas générer d’inheritance à partir de FILE, cela le disqualifie en tant qu’OO, mais vous pouvez affirmer que c’est davantage une faute de son environnement (C simple) que l’idée abstraite du fichier-as -object lui-même.

En fait, vous pourriez probablement faire en sorte que FILE ressemble à une interface java. Dans le monde Linux, vous pouvez utiliser presque n’importe quel type de périphérique d’E / S via les appels d’ouverture / fermeture / lecture / écriture / ioctl; les fonctions FILE sont juste des couvertures en plus de celles-ci; Par conséquent, dans FILE, vous avez quelque chose comme une classe abstraite qui définit les opérations de base (ouvrir / lire / etc.) sur un ‘périphérique abstraite d’e / s’, laissant le soin aux divers types de types dérivés de maquiller ceux avec des types spécifiques comportement.

Certes, il est très difficile de voir l’OO dans une stack de code C et très facile de casser les abstractions, ce qui explique pourquoi les langages OO sont tellement plus populaires de nos jours.

C est un langage orienté object?

La programmation orientée object (OOP) était-elle autre chose qu’un concept de laboratoire lorsque C et FILE ont été créés?

Répondre à ces questions répondra à votre question.

MODIFIER:

Réflexions supplémentaires: L’object Orienté signifie spécifiquement plusieurs comportements, notamment:

Héritage: Pouvez-vous dériver de nouvelles classes à partir de FILE?

Polymorphisme: pouvez-vous traiter les classes dérivées en tant que FILE?

Encapsulation: pouvez-vous mettre un fichier dans un autre object?

Méthodes et propriétés: un fichier a-t-il des méthodes et des propriétés spécifiques? (par exemple, myFile.Name, myFile.Size, myFile.Delete ())

Bien qu’il existe des “astuces” bien connues du C pour accomplir quelque chose qui ressemble à chacun de ces comportements, cela n’est pas intégré à FILE et ce n’est pas l’intention originale.

Je conclus que FILE n’est pas orienté object.

Si le type de fichier était “orienté object”, nous pourrions probablement en tirer une signification significative. Je n’ai jamais vu un exemple convaincant d’une telle dérivation.

Disons que j’ai une nouvelle abstraction matérielle, un peu comme une socket, appelée trou de ver. Puis-je dériver de FILE (ou socket) pour l’implémenter. Pas vraiment – j’ai probablement apporté quelques modifications aux tables du kernel du système d’exploitation. Ce n’est pas ce que j’appelle l’orientation d’object

Mais toute cette question se résume à la sémantique. Certaines personnes insistent sur le fait que tout ce qui utilise une table de saut est orienté object, et IBM a toujours prétendu que ses boîtes AS / 400 étaient orientées object, de bout en bout.

Pour ceux d’entre vous qui veulent plonger dans la folie et la bêtise que sont les groupes de discussion USENET comp.object, ce sujet a été discuté de manière assez exhaustive il y a quelques années, bien que par des gens fous et stupides. Si vous souhaitez explorer ces profondeurs, l’interface de Google Groupes est un bon sharepoint départ.

Ça dépend. Comment définissez-vous une “interface orientée object”? Comme le montrent les commentaires sur le message de abelenky, il est facile de construire un argument selon lequel FILE est orienté object. Cela dépend de ce que vous entendez par “orienté object”. Il n’a aucune méthode de membre. Mais il a des fonctions spécifiques.

Il ne peut en être déduit au sens “conventionnel”, mais il semble être polymorphe. Derrière un pointeur FILE, la mise en œuvre peut varier considérablement. Il peut s’agir d’un fichier, d’une mémoire tampon, d’une prise ou de la sortie standard.

Est-il encapsulé? Eh bien, il est essentiellement mis en œuvre sous forme de pointeur. Il n’y a pas d’access aux détails d’implémentation indiquant l’emplacement du fichier, ni même au nom du fichier, à moins que vous n’appeliez les fonctions d’API appropriées. Cela semble encapsulé pour moi.

La réponse est fondamentalement ce que vous voulez que ce soit. Si vous ne voulez pas que FILE soit orienté object, définissez “orienté object” de manière que FILE ne puisse pas remplir.

C a la première moitié de l’object orienté. Encapsulation, c’est-à-dire que vous pouvez avoir des types composés comme FILE * ou struct, mais vous ne pouvez pas en hériter, ce qui est la deuxième moitié (bien que moins importante)

C n’est pas un langage orienté object.

Je sais que c’est une “réponse absolue”, ce que vous ne vouliez pas, mais je crains que ce ne soit la seule réponse. Le raisonnement est que C n’est pas orienté object, donc aucune partie de celui-ci ne peut avoir une “interface orientée object”.

Clarification:

À mon avis , la véritable orientation object implique la dissortingbution de méthode via un polymorphism de sous-type. Si une langue manque de cela, elle n’est pas orientée object.

L’orientation object n’est pas une “technique” comme GTK. C’est une fonctionnalité linguistique. Si la langue manque de fonctionnalité, elle n’est pas orientée object.

Si l’orientation object n’était qu’une technique, alors presque tous les langages pourraient s’appeler orientés object et le terme cesserait d’avoir une véritable signification.

Il existe différentes définitions de oo autour. Celui que je trouve le plus utile est le suivant (inspiré par Alan Kay):

  1. les objects sont dans un état (références à d’autres objects)
  2. les objects reçoivent (et traitent) des messages
  3. le traitement d’un message peut entraîner
    • messages envoyés à l’object lui-même ou à d’autres objects
    • un changement d’état de l’object

Cela signifie que vous pouvez programmer de manière orientée object dans n’importe quel langage de programmation impératif, même assembleur. Un langage purement fonctionnel n’a pas de variable d’état, ce qui rend impossible ou du moins difficile à mettre en œuvre (rappelez-vous: LISP n’est pas pur!); il en va de même pour les langages purement déclaratifs.

En C, les messages transmis sont le plus souvent implémentés sous forme d’appels de fonction avec un pointeur sur une structure contenant le premier argument de l’état de l’object, comme dans le cas de l’api de gestion de fichiers. Néanmoins, C en tant que langage ne peut pas être classé comme oo car il n’a pas de support syntaxique pour ce style de programmation.

En outre, d’autres définitions de oo incluent des éléments tels que l’inheritance basé sur les classes (alors qu’en est-il des langages prototypaux?) Et l’encapsulation – ce qui n’est pas vraiment essentiel à mon avis – mais certaines d’entre elles peuvent être implémentées en C avec certains pointeurs la magie.