Files
saselang-bible/chapters/013-interfaces.md
2026-09-13 10:20:16 +02:00

90 lines
2.6 KiB
Markdown

# 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
qualification const et contraintes génériques pertinentes
modificateurs contractuels pertinents
```
`faults` reste visible dans la déclaration et dans la documentation, mais sa nature optionnelle/non exhaustive signifie qu'il n'impose pas la même compatibilité d'override que `throws`.
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<T> {
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.
---