Étendre et implémenter en même temps dans Kotlin

88

En Java, vous pouvez faire des choses telles que:

class MyClass extends SuperClass implements MyInterface, ...

Est-il possible de faire la même chose à Kotlin? En supposant qu'il SuperClassest abstrait et n'implémente pasMyInterface

chntgomez
la source

Réponses:

141

Il n'y a pas de différence syntaxique entre l' implémentation d'interface et l' héritage de classe . Répertoriez simplement tous les types séparés par des virgules après un deux-points, :comme indiqué ici:

abstract class MySuperClass
interface MyInterface

class MyClass : MySuperClass(), MyInterface, Serializable

L'héritage de classes multiples est interdit tandis que plusieurs interfaces peuvent être implémentées par une seule classe.

s1m0nw1
la source
1
L'ordre est-il important, ou est-ce que la parenthèse prend en compte le parent et les interfaces?
SMBiggs le
Je ne peux pas penser à une raison pour laquelle l'ordre serait important. Oui, chaque classe abstraite aura besoin de parens alors que les interfaces fonctionnent sans. Le compilateur sait si vous implémentez une interface ou étendez une super classe
s1m0nw1
2

Voici la syntaxe générale à utiliser lorsqu'une classe est en train d'étendre (une autre classe) ou d'implémenter (une ou plusieurs interfaces serveur):

class Child: InterfaceA, InterfaceB, Parent(), InterfaceZ

Notez que l'ordre des classes et des interfaces n'a pas d'importance.

Notez également que pour la classe qui est étendue, nous utilisons des parenthèses, la parenthèse fait référence au constructeur principal de la classe parente. Par conséquent, si le constructeur principal de la classe parente prend un argument, la classe enfant doit également passer cet argument.

interface InterfaceX {
   fun test(): String
}

open class Parent(val name:String) {
    //...
}

class Child(val toyName:String) : InterfaceX, Parent("dummyName"){

    override fun test(): String {
        TODO("Not yet implemented")
    }
}
Monsieur Q
la source