# 13. Interfaces ## 13.1 Nature — V1 REQUIS — FIGÉ Saselang utilise des interfaces et ne prévoit pas un concept séparé de `trait` en V1. Une interface : - peut hériter de plusieurs interfaces ; - ne possède pas d'état d'instance propre ; - ne possède pas de `construct`/`destruct` d'instance ; - peut fournir des méthodes par défaut ; - peut définir des constantes associées de contrat. ## 13.2 Méthodes de contrat et defaults — V1 REQUIS — FIGÉ Sans corps : contrat abstrait implicite. Avec corps : implémentation par défaut. Pas besoin de `abstract` ou `open` sur une méthode d'interface. ## 13.3 Signature — V1 REQUIS — FIGÉ La signature de surcharge d'une méthode contient uniquement : ```text nom + ordre des paramètres + type de chaque paramètre ``` Le type de retour ne fait pas partie de la signature. ## 13.4 Contrat — V1 REQUIS — FIGÉ EN PRINCIPE Pour la compatibilité d'héritage, le contrat comprend au minimum : ```text type de retour visibilité fallibilité / Result throws contraintes génériques pertinentes modificateurs contractuels pertinents ``` Les futurs pré/post-contrats formels, s'ils existent, devront également participer à cette notion. ## 13.5 Conflits d'héritage multiple — V1 REQUIS — FIGÉ Lorsque deux chemins héritent de la même signature : 1. si les contrats diffèrent -> erreur de compilation ; 2. si les contrats sont compatibles et aucun default distinct n'existe -> fusion du contrat ; 3. si un seul default distinct existe -> ce default est hérité ; 4. si deux defaults distincts existent -> override explicite obligatoire ; 5. si les deux chemins héritent exactement du même default depuis un ancêtre commun sans le redéfinir -> pas de faux conflit. Il n'existe aucune priorité implicite « premier parent gagne » ou « dernier parent gagne ». ## 13.6 Visibilité des contrats — V1 REQUIS — FIGÉ Les contrats d'interface peuvent être : ```text module package public ``` Pas de `private` ni `protected` pour un contrat exposé par interface. ## 13.7 Constantes associées — V1 REQUIS — À FINALISER Direction retenue : ```text public interface Ring { public const T Zero; public const T One; } ``` Une interface pourra probablement fournir une valeur par défaut à une constante associée, mais syntaxe, résolution des conflits et règles de spécialisation doivent encore être figées. ---