Rozszerzaj i wdrażaj jednocześnie w Kotlinie

88

W Javie możesz zrobić coś takiego jak:

class MyClass extends SuperClass implements MyInterface, ...

Czy w Kotlinie można zrobić to samo? Założenie SuperClassjest abstrakcyjne i nie realizujeMyInterface

chntgomez
źródło

Odpowiedzi:

141

Nie ma różnicy składniowej między implementacją interfejsu a dziedziczeniem klas . Po prostu wypisz wszystkie typy oddzielone przecinkami po dwukropku, :jak pokazano tutaj:

abstract class MySuperClass
interface MyInterface

class MyClass : MySuperClass(), MyInterface, Serializable

Dziedziczenie wielu klas jest zabronione, podczas gdy wiele interfejsów może być implementowanych przez jedną klasę.

s1m0nw1
źródło
1
Czy więc porządek ma znaczenie, czy też nawias dba o to, kto jest rodzicem, a które są interfejsami?
SMBiggs
Nie mogę wymyślić powodu, dla którego porządek miałby znaczenie. Tak, każda klasa abstrakcyjna będzie potrzebować parenów, podczas gdy interfejsy będą działać bez. Kompilator wie, czy implementujesz interfejs, czy rozszerzasz
superklasę
2

Oto ogólna składnia, której należy używać, gdy klasa rozszerza (inną klasę) lub implementuje (jeden lub serwerowy interfejs):

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

Zauważ, że kolejność klas i interfejsów nie ma znaczenia.

Zauważ też, że dla klasy, która jest rozszerzona, używamy nawiasów, nawias ten odnosi się do głównego konstruktora klasy macierzystej. Dlatego jeśli główny konstruktor klasy nadrzędnej przyjmuje argument, klasa potomna również powinna przekazać ten 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")
    }
}
Panie Q
źródło