Как получить вызывающую функцию функции kotlin

В этом примере:

open class Parent { fun some():Parent { return this; } } class A : Parent(){ val name:String? = null; } 

Но тогда этот код приводит к ошибке:

 val a = A().some().some() a.name // ERROR 

ПРИМЕЧАНИЕ РЕДАКТОРА: основанный на комментариях автора к ответам ниже, вопрос НЕ о ссылках на a.name но на самом деле о чем-то вроде «как получить экземпляр класса или его имени, которое впервые запустило цепочку вызовов методов», , Прочитайте все комментарии ниже, пока OP не изменит это для ясности.

моя конечная цель – вернуть тип звонящего и может вызвать свойство экземпляра вызывающего объекта, не более, не более переопределять, какую-либо идею?

Solutions Collecting From Web of "Как получить вызывающую функцию функции kotlin"

В действительности ваш пример работает (если вы добавите open ключевое слово, потому что все классы в Kotlin по умолчанию окончательны:

A.kt

  open class A { fun some(): A { return this } } 

B.kt

  class B : A() { val test = "test" } 

И использование

 val tmpB = (B().some().some() as B) val test = tmpB.test 

Отредактировано: Это потому, что функция some () возвращает родительский класс, который не имеет дочернего класса. Поэтому вам нужно отдать его в класс child. (Обновить код)

Как и java , вы можете использовать getMethodName() . Обратитесь к документу kotlin .

 open class Parent{ open fun foo(): Parent { return this; } } 

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

 class A : Parent() { override fun foo(): A { return this } } 

Это класс с именем A который расширяет класс Parent . foo() – это метод класса A, который вернет экземпляр собственного класса.

Назовем это так:

 var a = A().foo().foo() 

Ваш класс всегда возвращает Parent экземпляр. У этого класса нет поля с name . Для этого у вас есть 2 способа:

Первый:

 open class Parent{ fun some():Parent{ return this } } class A :Parent(){ val name:String? = null } fun main() { val a = (A().some().some() as A) a.name = ""; } 

Второй:

 open class Parent{ open fun some():Parent{ return this } } class A :Parent(){ override fun some():A { return this } val name:String? = null } fun main() { val a = A().some().some() a.name = ""; } 

я знаю, как это сделать:

@Avijit Karmakar

@ Trần Đức Tâm

использовать встроенную функцию

  inline fun <reified T:Any> some(sql: String):T { return this as T ; }