В этой главе мы узнаем о другой новой функции Kotlin, названной «Extension». Используя расширение, мы сможем добавлять или удалять некоторые функции метода, даже не наследуя и не изменяя их. Расширения разрешены статистически. На самом деле он не изменяет существующий класс, но создает вызываемую функцию, которая может быть вызвана с помощью точечной операции.
Расширение функции
В расширении функции Kotlin позволяет определять метод вне основного класса. В следующем примере мы увидим, как расширение реализовано на функциональном уровне.
class Alien { var skills : String = "null" fun printMySkills() { print(skills) } } fun main(args: Array<String>) { var a1 = Alien() a1.skills = "JAVA" //a1.printMySkills() var a2 = Alien() a2.skills = "SQL" //a2.printMySkills() var a3 = Alien() a3.skills = a1.addMySkills(a2) a3.printMySkills() } fun Alien.addMySkills(a:Alien):String{ var a4 = Alien() a4.skills = this.skills + " " +a.skills return a4.skills }
В приведенном выше примере у нас нет никакого метода внутри класса «Alien» с именем «addMySkills ()», однако мы все еще реализуем тот же метод где-то за пределами класса. Это волшебство расширения.
Приведенный выше фрагмент кода сгенерирует следующий вывод в браузере.
JAVA SQL
Расширение объекта
Kotlin предоставляет еще один механизм для реализации статической функциональности Java. Это может быть достигнуто с помощью ключевого слова «объект-компаньон». Используя этот механизм, мы можем создать объект класса внутри метода фабрики, а позже мы можем просто вызвать этот метод, используя ссылку на имя класса. В следующем примере мы создадим «объект-компаньон».
fun main(args: Array<String>) { println("Heyyy!!!"+A.show()) } class A { companion object { fun show():String { return("You are learning Kotlin from TutorialsPoint.com") } } }
Приведенный выше фрагмент кода выдаст следующий вывод в браузере.
Heyyy!!! You are learning Kotlin from TutorialsPoint.com
Приведенный выше пример выглядит как статический в Java, однако в реальном времени мы создаем объект как переменную-член того же класса. Вот почему он также включен в свойство extension и может альтернативно называться расширением объекта. Вы в основном расширяете объект того же класса, чтобы использовать некоторые функции-члены.