Kotlin - Как я могу получить доступ к моей новой функции расширения класса из другого файла

Я очень новичок в 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

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

Я не могу получить доступ к функции, как это - не видно.

2 ответа

Решение

Ответ на мой вопрос, который меня устраивает, состоит в том, чтобы просто извлечь метод в некоторую структуру "объекта" в другом файле, и всякий раз, когда мы хотим получить доступ к этой функции, мы должны импортировать путь (package.object.method) к этому.

Но проблема в том, что IDE не предлагает мне путь к моей функции расширения - я должен импортировать ее сам.

Я использую Android Studio 3 Preview, надеюсь, это будет исправлено.

ОБНОВИТЬ

Лучше определить эти функции в простом файле Kotlin, чтобы функции не принадлежали какой-либо структуре. Тогда это не будет проблемой с автоматическим импортом из IDE из любого места.

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

Эти статические функции (также известные как функции расширения) имеют некоторые ограничения.

Они не добавляются в иерархию классов, поэтому подклассы не могут наследовать их (если вы определяете функцию расширения для родительского класса, вы не можете ожидать, что этот метод будет присутствовать в дочернем классе)

У них нет доступа к частным свойствам класса, который они расширяют.

Также они разрешаются статически, например (взято отсюда)

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.

Есть способ сделать это:

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

Child(...).toChild2()

Прежде всего: в исходном коде много ошибок, которые вы должны исправить, прежде чем задавать вопрос здесь (пропущены аннотации типов в конструкторах, пропущены val/var так далее.).

На ваш вопрос: Обычно вы можете получить доступ к функциям расширения, даже если они определены в разных файлах kt. Прочитайте официальные документы, охватывающие области расширения.

Важно импортировать вашу функцию расширения

Другие вопросы по тегам