Розширити та впровадити одночасно в Котліні


88

У Java ви можете зробити таке:

class MyClass extends SuperClass implements MyInterface, ...

Чи можна зробити те саме в Котліні? Припускаючи, що SuperClassце абстрактно і не реалізуєтьсяMyInterface

Відповіді:


141

Немає синтаксичної різниці між реалізацією інтерфейсу та успадкуванням класу . Просто перелічіть усі типи, розділені комами після двокрапки, :як показано тут:

abstract class MySuperClass
interface MyInterface

class MyClass : MySuperClass(), MyInterface, Serializable

Наслідування декількох класів заборонено, тоді як декілька інтерфейсів можуть бути реалізовані одним класом.


1
Тож чи має значення порядок, або дужки дбають про те, хто є батьківським, а які інтерфейсами?
SMBiggs

Я не можу придумати причини, чому порядок мав би значення. Так, кожному абстрактному класу знадобляться парени, поки інтерфейси працюють без. Компілятор знає, чи впроваджуєте ви інтерфейс, чи розширюєте супер клас
s1m0nw1

2

Це загальний синтаксис, який слід використовувати, коли клас розширюється (інший клас) або реалізує (один або серверний інтерфейс):

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

Зауважте, що порядок класів та інтерфейсів не має значення.

Також зауважте, що для розширеного класу ми використовуємо дужки, ця дужка відноситься до основного конструктора батьківського класу. Отже, якщо основний конструктор батьківського класу приймає аргумент, тоді дочірній клас також повинен передавати цей аргумент.

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")
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.