2.4 KiB
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/destructd'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 :
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 :
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 :
- si les contrats diffèrent -> erreur de compilation ;
- si les contrats sont compatibles et aucun default distinct n'existe -> fusion du contrat ;
- si un seul default distinct existe -> ce default est hérité ;
- si deux defaults distincts existent -> override explicite obligatoire ;
- 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 :
module
package
public
Pas de private ni protected pour un contrat exposé par interface.
13.7 Constantes associées — V1 REQUIS — À FINALISER
Direction retenue :
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.