Miguel Moquillon wrote:
Laurent Deniau wrote:
Un langage objet est un langage qui supporte les caractéristiques
centrales du paradigme objet, et principalement:
- encapsulation,
- typage (Liskov ou Cook), qu'il soit statique, dynamique ou par
inférence, - définition d'objets (que ce soit par classes ou par
prototypes), - communication par messages,
- polymorphisme,
- héritage (sous-typage ou classification, etc.),
- tout est objet.
D'apres ces definitions, C est aussi un langage objet.
C supporte t'il par exemple le polymorphisme ? Non. Il faut l'implémenter
soit même.
Si (je precise polymorphisme de soustypage pour le cas present).
C supporte nativement le polymosphisme de soustypage au sens de Liskov. Ce qu'il faut pour faire ce polymorphisme, c'est (implicitement ou explicitement) la notion de pointeur et la possibilite de reinterpreter une aggregation sur une 'sous-aggregation', c'est-a-dire etre autorise par le langage a appliquer le principe de substitution. Et la norme du C l'autorise.
Ce que C ne supporte pas, c'est la variance de type que "presque" tous les langages OO supportent (certains ont un typage fort sans proposer de regle de variance de type). Et la il faut le faire a la main avec un cast.
Accessoirement, la variance de type n'a de sens que sur un systeme de typage fort, ce que C supporte aussi nativement.
Quand j'écris "supporte", cela signifie de façon native. Sinon, j'aurais
écris plutôt "permette d'obtenir/d'implémenter"
Suivant le concept OO dont on parle, la difference peut-etre subtile voila pourquoi je precisais ;-) Par exemple, C++ a etendu considerablement ces capacites OO grace a la combinaison macros+templates parce qu'ils permettent d'obtenir ces concepts.
Maintenant, ce que j'attends en plus d'un langage objet est aussi:
- conception par contrat (pré/post conditions + invariants),
- si typage statique, la covariance multiple et la généricité contrainte,
- les closures,
- et, si en plus le langage supporte la syntaxe language (sujet verbe
complément) comme avec SmallTalk ou Lisaac, alors je suis heureux :)
Tout ca aussi, C permet de le faire.
Avoir la caractéristique syntaxique langage dans C, ça ne doit pas être du
coton. Idem avec la conception par contrat.
- conception par contrat, c'est plus une discipline de programmation qu'un probleme de support syntaxique.
- typage statique, covariance simple et genericite contrainte demande de passer par des macros. La covariance multiple ne me semble pas accessible au C, mais peut-etre que qqun a trouve comment le faire.
- closures, c'est essentiellement un probleme de gestion memoire qui se resout par un comptage de reference sur objet dynamique.
Donc peut-etre il faudrait ajouter supporte 'nativement'?
AMHA C'est redondant. En fait le verbe "supporter" signifie bien que le
langage _a_ ses caractéristiques, et non permet de les avoir.
Sur le fond, je suis biensur d'accord ;-)
a+, ld.