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

 


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