88 lines
2.4 KiB
Markdown
88 lines
2.4 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
|
|
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<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.
|
|
|
|
---
|