私はコトリンに非常に新しいです。
抽象クラスに関数を追加できるようにしたいので、その関数を定義すると、そのクラスのすべての子でそれを呼び出すことができます(抽象クラスを継承します)
しかし、これらの拡張関数を他のファイルで定義したい。抽象クラスの特定の子実装でそれらを呼び出そうとすると、これらの関数にアクセスできません。
問題を解決するために必要なルールは何ですか?
私はこのようなことを達成できるようにしたいです:
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
すべてのクラスを別のファイルで定義し、拡張関数も他のファイルで定義しました。
このような機能にアクセスできません-表示されません。
それを行う方法があります:
fun <T: Parent> T.toChild2() {
TODO()
}
Child(...).toChild2()
ここでは拡張関数について誤解があると思います。拡張関数は、関数を定義して操作するときに暗黙的にパラメーターとしてレシーバークラスのインスタンスを受け取る通常の静的関数です。
これらの静的関数(別名拡張関数)にはいくつかの制限があります。
それらはクラス階層に追加されないため、サブクラスはそれらを継承できません(親クラスの拡張関数を定義する場合、そのメソッドが子クラスに存在することは期待できません)
彼らは、拡張しているクラスのプライベートプロパティにアクセスできません。
また、それらは静的に解決されます。たとえば( ここから取得 )
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」が出力されます。