2015-02-03 4 views
2

В Котлин, учитывая некоторый класс:Котлин: суперкласса не доступен из признака

public open class A { 
    open fun sayHi() = "hi" 
} 

И черта T, которая требует подклассы для расширения A:

public trait T : A { 
    override fun sayHi() = super.sayHi() + " John" 
} 

Можно было бы ожидать T.sayHi быть в состоянии для вызова super.sayHi() или более явным super<A>.sayHi(), так как вся информация о типе есть, но вместо этого она дает Superclass is not accessible from trait.

Вопрос:

[Как] я могу переопределить некоторые метод из признака?

Примечания:

Конечно, без перекрывая я просто не мог сделать:

public trait T : A { 
    fun another() = sayHi() + " John" 
} 

Но я хочу, чтобы моя черта, чтобы иметь возможность «перехватывают/быть в середине».

Мне пришлось использовать некоторый делегат, чтобы добиться аналогичного поведения, но я хотел бы знать, можно ли это сделать с помощью черт.

+1

Функция «требуется класс признака» является неоспоримым устаревшим и в конечном итоге будут удалены из Котлин. Взгляните на http://blog.jetbrains.com/kotlin/2015/04/upcoming-changes-and-more/ –

+0

, спасибо за обновление. Слишком плохо, я действительно использовал эту функцию u__u Мне очень полезно явно заявить о требованиях, которые имеет моя черта. – Logain

ответ

1

Как @Salomon проигнорировал свой комментарий, эта функция будет удалена на более поздних версиях Kotin, что сделает этот вопрос более недействительным.

Требуемые классы

Некоторые из вас, возможно, слышали эту особенность: черты в Котлин могут «расширяющие» классы (мы на самом деле использовать термин «требуют»).

Технически это означает, что, когда класс расширяет такой признак, он должен (прямо или косвенно) также расширить необходимый класс. Эта функция имеет очень мало вариантов использования, поэтому мы ее обесцениваем.

Источник: http://blog.jetbrains.com/kotlin/2015/04/upcoming-changes-and-more/