web-dev-qa-db-ja.com

Kotlin-別のファイルから新しいクラス拡張関数にアクセスする方法

私はコトリンに非常に新しいです。

抽象クラスに関数を追加できるようにしたいので、その関数を定義すると、そのクラスのすべての子でそれを呼び出すことができます(抽象クラ​​スを継承します)

しかし、これらの拡張関数を他のファイルで定義したい。抽象クラスの特定の子実装でそれらを呼び出そうとすると、これらの関数にアクセスできません。

問題を解決するために必要なルールは何ですか?

私はこのようなことを達成できるようにしたいです:

abstract class Parent(val val1, val val2, val val3){}

class Child(var val1, var val2, var val3) : Parent(val1, val2, val3){}

class Child2(var val1, var val2, var val3) : Parent(val1, val2, val3){}

親とすべての子の拡張メソッド:

 fun Parent.convertToChild2( ): Child2? {

return //some creation method of Child2
} 

そして、私はこれを呼び出すことができるようにしたいです:

child: Child
child.convertToChild2

すべてのクラスを別のファイルで定義し、拡張関数も他のファイルで定義しました。

このような機能にアクセスできません-表示されません。

9
K.Os

それを行う方法があります:

fun <T: Parent> T.toChild2() {
    TODO()
}

Child(...).toChild2()
0
neworld

ここでは拡張関数について誤解があると思います。拡張関数は、関数を定義して操作するときに暗黙的にパラメーターとしてレシーバークラスのインスタンスを受け取る通常の静的関数です。

これらの静的関数(別名拡張関数)にはいくつかの制限があります。

それらはクラス階層に追加されないため、サブクラスはそれらを継承できません(親クラスの拡張関数を定義する場合、そのメソッドが子クラスに存在することは期待できません)

彼らは、拡張しているクラスのプライベートプロパティにアクセスできません。

また、それらは静的に解決されます。たとえば( ここから取得

open class Shape

class Rectangle: Shape()

fun Shape.getName() = "Shape"

fun Rectangle.getName() = "Rectangle"

fun printClassName(s: Shape) {
  println(s.getName())
}     

printClassName(Rectangle())

呼び出される拡張関数は、Shapeクラスであるパラメーターsの宣言された型にのみ依存するため、この例では「Shape」が出力されます。

0
Mr.Q