Одновременное расширение и внедрение в Котлине

88

В Java вы можете делать такие вещи, как:

class MyClass extends SuperClass implements MyInterface, ...

Можно ли сделать то же самое в Котлине? Предполагается SuperClassабстрактно и не реализуетMyInterface

Chntgomez
источник

Ответы:

141

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

abstract class MySuperClass
interface MyInterface

class MyClass : MySuperClass(), MyInterface, Serializable

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

s1m0nw1
источник
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")
    }
}
Мистер Кью
источник