2016-07-23 2 views
2

При попытке создать встроенные функции на интерфейсе, вы будете сталкиваться ошибкой: 'inline' modifier is not allowed on virtual members. Only private or final members can be inlinedJava не разрешает окончательные методы по умолчанию .. но делает Kotlin?

the error pictured in IDEA

Я понимаю, что это происходит потому, что функция является виртуальной, поскольку она может быть отменена.

Если бы мы смогли объявить «закрытые» функции, эти функции не были бы виртуальными и, следовательно, могли бы быть встроенными, что очень полезно!

Использование «private» дает нам не виртуальную «закрытую» функцию, но тогда остальная часть мира не может ее использовать!

Итак, есть ли способ определить «закрытые» не виртуальные встроенные функции для абстрактных типов?

(пса я намерен ответить на этот вопрос сам, но не стесняйтесь поделиться своим ответами!)

ответ

4

Вы говорите, что для «абстрактных типов» и для абстрактного класса можно объявить inline функции, и это автоматически считается окончательным.

abstract class BaseThing { 
    inline fun foo() = "asdf" 
} 

Функция foo можно назвать, но не может быть переопределен в классах-потомках. В результате этого возникает ошибка:

'Foo' in 'BaseThing' is final and cannot be overridden

Интерфейс, с другой стороны, не может иметь окончательных методов. Но вы можете написать функцию расширения для интерфейса, который действует почти одинаково.

interface TraitThing { } 
inline fun TraitThing.foo() = "asdf" 

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

+0

Я не знал о 'inline' в абстрактных классах! Отличный ответ! – Jire

Смежные вопросы