Laurent Deniau wrote:
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.
Tu le peux effectivement si tu écris toi même le mécanismes le permettant :
c'est à dire écrire une relation entre des structures de données qui
permettent ceci (le plus simple : champs communs entre les deux structures
de données "parentes"). Ce n'est pas fournit par défaut par un mécanisme du
langage, tu utilises juste les possibilités du langage pour implémenter ou
simuler un tel mécanisme.
- conception par contrat, c'est plus une discipline de programmation
qu'un probleme de support syntaxique.
Je ne suis pas tout à fait d'accord là dessus. La conception par contrat est
avant tout un support à la fois syntaxique mais aussi sémantique. Par
exemple, le support de la conception par contrat (qui est autre chose que
de simples assertions) permet de penser différemment la gestion des
exceptions puisque ces dernières ne sont plus alors gérées de la façon
"classique" : en gros les exceptions sont provoquées par des violations de
contrat, à partir de là, on pense les exceptions différemment.
- closures, c'est essentiellement un probleme de gestion memoire qui se
resout par un comptage de reference sur objet dynamique.
Je ne crois pas car lorsque tu passes d'un appel à un autre, entre temps ton
compteur de référence peut-être à 0 et là bye bye. Une implémentation
classique des closures est la gestion d'une structure de données qui
contient un pointeur sur le code de la fonction et l'ensemble des
variables/valeurs de la fonction crée au moment de son appel. En C, on peut
simuler les closures en utilisant le mot-clé static. Par exemple:
int myfunc()
{
static int call_count = 0;
static struct FuncState_t state_info;
return ++call_count;
}