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

 


Споріднені теми