Выражения объектов, множественный синтаксис спецификации супертипа? - PullRequest
0 голосов
/ 08 мая 2019

Я новичок в Котлине.Я наткнулся на раздел Выражения объектов из https://kotlinlang.org

Некоторые синтаксисы выражений объектов очень просты для понимания,

Создатьобъект анонимного класса

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) { ... }

    override fun mouseEntered(e: MouseEvent) { ... }
})

Просто объект

fun foo() {
    val adHoc = object {
        var x: Int = 0
        var y: Int = 0
    }
    print(adHoc.x + adHoc.y)
}

Но я не могу понять "Выражение объекта с указанием нескольких супертипов" Пример приведен ниже:

open class A(x: Int) {
    public open val y: Int = x
}

interface B { ... }

val ab: A = object : A(1), B {
    override val y = 15
}

Что здесь происходит?

${ab.y} печать 15, но синтаксис -> ${ab.A.y} недопустим.Мое понимание ${ab.A.y} будет печатать 1:)

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Эта строка здесь:

val ab: A = object : A(1), B {

означает, что класс ab наследуется от класса A и реализует интерфейс B.

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

open class A(x: Int) {
    public open val y: Int = x
}

interface B {
    fun hi()
}

val ab: A = object : A(1), B {
    override val y = 15

    override fun hi() {
        println("hi")
    }
}

Выражение ${ab.A.y} не имеет большого смысла в этом контексте, потому что объект ab не имеет никакого поля A.A - это просто унаследованный суперкласс, к которому вы могли бы в конечном итоге привести.

1 голос
/ 08 мая 2019

Он в основном создает объект ab с типом класса A с реализацией интерфейса B .

Итак, допустим, у вашего класса A есть некоторый метод foo() & интерфейс B имеет некоторый метод bar(), вы можете обращаться к ним обоим по объекту ab, поскольку он имеет тип класса A с реализацией B.

Следовательно, здесь вы переопределяете переменную y с помощьюзначение 15 означает, что ваша переменная суперкласса y будет переопределена значением 15 из 1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...