2016-07-23 12 views
2

インターフェイス上でインライン関数を作成しようとすると、エラーに直面するだろう:'inline' modifier is not allowed on virtual members. Only private or final members can be inlinedJavaは最終的なデフォルトメソッドを許可しません。しかし、Kotlinはしますか?

the error pictured in IDEA

私はそれを上書きすることができますので、関数が仮想であるためであると理解しています。

「閉じた」関数を宣言できれば、これらの関数は仮想ではないため、非常に便利なインライン化が可能です!

「非公開」を使用すると、仮想ではない「閉鎖」機能が提供されますが、他の国では使用できません。

だから、抽象型のための非閉じた非インライン関数を定義する方法はありますか?

psの私はこの質問を自分自身に答えるつもりはなく、あなた自身の答えを共有すること自由に感じ!

答えて

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" 

しかし、あなたが実装するクラスで同じ名前のメソッドを実装することができ、それが優先されますので、何の保護または「closedness」はありません。

+0

私は抽象クラスで 'inline'について知りませんでした!素晴らしい答え! – Jire

関連する問題