Что такое перегрузка методов

Ответ

Перегрузка методов (method overloading) — это возможность объявлять несколько методов с одним именем, но разными параметрами (типами, количеством или порядком). Компилятор определяет, какой метод вызвать, на основе переданных аргументов.

fun sum(a: Int, b: Int): Int {
    return a + b
}

fun sum(a: Double, b: Double): Double {
    return a + b
}

fun sum(a: Int, b: Int, c: Int): Int {
    return a + b + c
}

Нюансы:

  • Возвращаемый тип не учитывается при перегрузке.
  • Параметры должны отличаться по типу, количеству или порядку.
  • Можно перегружать методы в одном классе или при наследовании.

Ответ 18+ 🔞

Смотри, объясняю про перегрузку методов, как для полных чайников. Это, блядь, как если бы у тебя был один друг, но в разных ситуациях он ведёт себя по-разному. Зовут его одинаково, а суть — разная, ёпта.

Представь, есть у тебя функция sum. Базовая, для интов. Складывает два целых числа — всё чётко.

fun sum(a: Int, b: Int): Int {
    return a + b
}

Но потом тебе вдруг понадобилось сложить не целые числа, а дробные, с плавающей точкой. Ну, деньги там посчитать или ещё какую хрень. Ты что, будешь новое имя функции придумывать? sumForDoubles? sumButForRealNumbers? Да похуй! Это же некрасиво и неудобно. Вот тут и выручает перегрузка.

Ты просто пишешь ещё одну функцию с ТЕМ ЖЕ ИМЕНЕМ sum, но с другими параметрами. Компилятор — не дурак, он посмотрит, какие аргументы ты туда суёшь, и сам поймёт, какую из функций вызывать.

fun sum(a: Double, b: Double): Double {
    return a + b
}

А если тебе вдруг три числа нужно сложить? Опять же, не паришься. Пишешь третью версию, с тремя параметрами.

fun sum(a: Int, b: Int, c: Int): Int {
    return a + b + c
}

И вот магия: ты вызываешь sum(2, 3) — работает первая. Вызываешь sum(2.5, 3.7) — срабатывает вторая. Вызываешь sum(1, 2, 3) — уже третья. Компилятор сам всё раскидывает, как умный диспетчер. Удобно, блядь, до безобразия.

А теперь главные подводные камни, чтобы ты не обосрался:

  • Возвращаемый тип — в жопу. Его компилятор вообще не учитывает, когда решает, какую перегруженную функцию тебе дать. Нельзя сделать одну функцию sum, которая возвращает Int, и другую с ТЕМИ ЖЕ параметрами, но возвращающую String. Он тебе скажет: «Чувак, я нихуя не пойму, какую из них ты хочешь, у них же сигнатуры одинаковые». И будет прав, пидарас шерстяной.
  • Параметры должны реально отличаться. Либо по типу (Int vs Double), либо по количеству (два аргумента vs три), либо по порядку (если типы разные, конечно). Вот на этом и строится вся магия выбора.
  • Работает везде. Можно перегружать методы в одном классе, можно в наследнике накрутить свои версии поверх родительских. Главное — логику не нарушай, а то получится пиздопроебибна, а не код.

Короче, перегрузка — это мощный инструмент, чтобы сделать апи удобнее, не заставляя пользователя запоминать кучу разных имён для одной и той же по сути операции. Просто помни про правила, и будет тебе счастье.