Kotlin. Перегрузка функций. Имена функций в обратных кавычках

Kotlin. Перегрузка функций. Имена функций в обратных кавычках


Содержание


Поиск на других ресурсах:

1. Понятие о перегрузке функции

В языке программирования Kotlin функция может быть перегружена. Перегрузка функции означает объявление функции с тем же именем несколько раз но с разными параметрами.

В наиболее общем случае перегрузка функции выглядит следующим образом:

fun FuncName(list_of_parameters1) : return_type1 {
  // ...
}

fun FuncName(list_of_parameters2) : return_type2 {
  // ...
}

...

fun FuncName(list_of_parametersN) : return_typeN {
  // ...
}

здесь

  • FuncName – перегруженное имя функции;
  • list_of_parameters1, list_of_parameters2, list_of_parametersN – список параметров соответствующего варианта перегруженной функции с именем FuncName. Каждый список параметров должен отличаться количеством или порядком следования типов параметров;
  • return_type1, return_type2, return_typeN – тип, возвращаемый соответствующим вариантом функции FuncName. Компилятор не считает возвращаемый тип как средство перегрузки функции.

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

  ⇑

2. Примеры перегрузки функций
2.1. Функция Min(). Поиск минимального значения между разным количеством чисел

Объявляется перегруженная функция Min(), вычисляющая минимальное значение между двумя, тремя, четырьмя, пятью числами типа Double.

// Перегрузка функции с именем Min
// Функция находит минимальное значение между разным количеством чисел.

// Между 2-мя числами
fun Min(num1:Double, num2:Double):Double {
  if (num1<num2)
    return num1
  return num2
}

// Между тремя числами
fun Min(num1:Double, num2:Double, num3:Double):Double {
  var min = num1
  if (min>num2) min=num2
  if (min>num3) min=num3
  return min
}

// Между четырьмя числами
fun Min(num1:Double, num2:Double, num3:Double, num4:Double):Double {
  var min = num1;
  if (min>num2) min = num2
  if (min>num3) min = num3
  if (min>num4) min = num4
  return min
}

// Между пятью числами
fun Min(num1:Double, num2:Double, num3:Double,
num4:Double, num5:Double):Double {
  var min = num1
  if (min>num2) min = num2
  if (min>num3) min = num3
  if (min>num4) min = num4
  if (min>num5) min = num5
  return min
}

fun main(args:Array<String>)
{
  // Демонстрация вызова функции Min
  // 1. Вызывается функция Min() с 2-мя параметрами
  var min = Min(2.5, 3.8)
  println(min)

  // 2. Вызов функции Min() с 3 параметрами
  min = Min(2.6, 3.8, 1.2)
  println(min)

  // 3. Вызов функции Min() с 4 параметрами
  println(Min(1.7, 3.2, 0.8, -3.5))

  // 4. Вызов функции Min() с 5 параметрами
  println(Min(7.2, 8.1, 6.5, 4.4, 2.8))
}

Результат выполнения программы

2.5
1.2
-3.5
2.8

  ⇑

2.2. Функция ConcatStrings(). Объединение разного количества строк

В примере приводится перегрузка функции ConcatStrings(), осуществляющая конкатенацию (объединение) разного количества строк. Реализованы 3 перегрузки функции.

// Перегрузка функции с именем ConcatStrings
// Функция объединяет разное количество строк
// 2 строки
fun ConcatStrings(s1:String, s2:String):String {
  return s1+s2
}

// 3 строки, вариант функции с единственным выражениемfun ConcatStrings(s1:String, s2:String, s3:String) : String =
s1+s2+s3

// 4 строки, вариант функции с единственным выражением// без явного указания типа возвращаемого результата
fun ConcatStrings(s1:String, s2:String, s3:String, s4:String) = s1+s2+s3+s4

fun main(args:Array<String>)
{
  // Демонстрация вызова функции ConcatStrings()
  // 1. Вызывается функция ConcatStrings() с 2-мя параметрами
  var resStr:String
  resStr=ConcatStrings("Hello", " world!")
  println(resStr)

  // 2. Вызов функции ConcatStrings() с 3 параметрами
  resStr = ConcatStrings("bestprog",".","net")
  println(resStr)

  // 3. Вызов функции ConcatStrings() с 4 параметрами
  println(ConcatStrings("Red-","Green-","Blue-","Yellow"))
}

Результат выполнения программы

Hello world!
bestprog.net
Red-Green-Blue-Yellow

  ⇑

2.3. Функция Average(). Вычисление среднего арифметического для разного количества целых и вещественных чисел

В примере показана перегрузка функции Average(), в которой входными параметрами являются разное количество разнотипных чисел типов Int, Double, Float, Long.

 

// Функция Average()
// Вычисление среднего арифметического для разного количества чисел
// 1. Вариант, где входными параметрами являются типы Int, Double
fun Average(a:Int, b:Double) = (a+b)/2.0

// 2. Вариант для случая Double, Int
fun Average(a:Double,b:Int):Double {
  return (a+b)/2.0
}

// 3. Вариант для случая Long, Float
fun Average(a:Long, b:Float):Double = (a+b)/2.0

// 4. Вариант для случая Int, Float, Double
fun Average(a:Int, b:Float, c:Double) = (a+b+c)/3

fun main(args:Array<String>)
{
  // Демонстрация использования функции Average
  // 1. Типы Int, Double
  val avg1 = Average(5, 6.8)
  println("avg1 = " + avg1)

  // 2. Типы Double, Int
  val avg2 = Average(7.2, 8)
  println("avg2 = " + avg2)

  // 3. Типы Long, Float
  val avg3 = Average(70L, 3.8f)
  println("avg3 = " + avg3)

  // 4. Типы Int, Float, Double
  val avg4 = Average(10, 20.0f, 15.0)
  println("avg4 = " + avg4)
}

Результат выполнения программы

avg1 = 5.9
avg2 = 7.6
avg3 = 36.900001525878906
avg4 = 15.0

  ⇑

2.4. Функция AscSequence(). Определяет, образуют ли числа возрастающую последовательность

Пример показывает объявление и использование 4-х перегруженных функций, которые определяют образуют ли несколько чисел возрастающую последовательность.

// Функция AscSequence()
// Определить, образуют ли числа возрастающую последовательность
// 1. Вариант, где входными параметрами есть типы Int, Int, Int
fun AscSequence(a:Int, b:Int, c:Int) : Boolean {
  return (a<b)and(b<c)
}

// 2. Вариант для случая Double, Double, Double
fun AscSequence(a:Double,b:Double, c:Double):Boolean {
  return (a<b)and(b<c)
}

// 3. Вариант для случая Int, Int, Int, Int
fun AscSequence(a:Int,b:Int,c:Int,d:Int):Boolean =
(a<b)and(b<c)and(c<d)

// 4. Вариант для случая Float, Int, Double, Double
fun AscSequence(a:Float,b:Int,c:Double,d:Double) =
(a<b)and(b<c)and(c<d)

fun main(args:Array<String>)
{
  // Демонстрация использования функции AscSequence()
  // 1. Случай AscSequence(Int, Int, Int)
  println("5<6<8 => " + AscSequence(5, 6, 8))

  // 2. Случай AscSequence(Double, Double, Double)
  val res = AscSequence(2.8, 3.5, 1.7)
  println("2.8<3.5<1.7 => " + res)

  // 3. Случай AscSequence(Int, Int, Int, Int)
  println("6<8<9<7 = " + AscSequence(6, 8, 9, 7))

  // 4. Случай AscSequence(Float, Int, Double, Double)
  println("7.5f<2<3.4<5.0 => " + AscSequence(7.5f, 2, 3.5, 5.0))
}

Результат выполнения программы

5<6<8 => true
2.8<3.5<1.7 => false
6<8<9<7 = false
7.5f<2<3.4<5.0 => false

  ⇑

3. Функции в обратных кавычках. Необходимость применения

В языке Kotlin существует средство задания имени функции в обратных кавычках – ` `. В этом случае имя функции может содержать символы пробела или другие нестандартные символы.

В наиболее общем применении объявление такой функции имеет вид:

fun `set_of_characters`(list_of_parameters):return_type {
  // ...
}

здесь

  • set_of_characters – набор символов, определяющих имя функции. Здесь допускается указывать символ пробел или другие нестандартные символы;
  • list_of_parameters – список параметров функции;
  • return_type – тип, возвращаемый функцией.

Вызов вышеприведенного объявления функции может быть примерно таким

`set_of_characters`(...)

здесь … означают перечень аргументов, передаваемых в функцию.

Задание имен функций в обратных кавычках необходимо по следующим причинам:

  • для поддержания совместимости с Java. Это могут быть случаи, когда вызываются методы Java из кода в файле на языке Kotlin. Примером этого применения может служить использование различных зарезервированных ключевых слов языка Java, которые нельзя применять в качестве имен для функций в языке Kotlin (например, ключевое слово is);
  • придание большей наглядности использования функций с помощью целых предложений, взятых в обратных кавычках.

  ⇑

4. Примеры функций, имена которых формируются в обратных кавычках

Ниже приводятся примеры функций, имена которых взяты в обратные кавычки. Имена некоторых функций более красноречиво объясняют их предназначение.

// Функции, взятые в обратные кавычки ``
// Функция, вычисляющая сумму трех параметров: a+b+c
fun `a + b + c`(a:Int, b:Int, c:Int) = a+b+c

// Функция, возвращающая реверсованную строку
fun `abc = cba`(s:String) : String {
  var s2 : String = ""
  for (c : Char in s)
    s2 = c + s2
  return s2
}

// Функция возвращающая произведение двух чисел
fun `a*b`(a:Double, b:Double) = a*b

fun main(args:Array<String>)
{
  // Вызов функции `a + b + c`()
  val res1 = `a + b + c`(6, 5, 9)
  println("res1 = " + res1)

  // Вызов функции `abc = cba`()
  val res2 = `abc = cba`("abcdef")
  println("res2 = " + res2)

  // Вызов функции умножения двух чисел типа Double
  println(`a*b`(9.5, 3.2))
}

Результат выполнения программы

res1 = 20
res2 = fedcba
30.400000000000002

  ⇑


Связанные темы

  ⇑