Ответ
Перегрузка методов (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. Он тебе скажет: «Чувак, я нихуя не пойму, какую из них ты хочешь, у них же сигнатуры одинаковые». И будет прав, пидарас шерстяной. - Параметры должны реально отличаться. Либо по типу (
IntvsDouble), либо по количеству (два аргумента vs три), либо по порядку (если типы разные, конечно). Вот на этом и строится вся магия выбора. - Работает везде. Можно перегружать методы в одном классе, можно в наследнике накрутить свои версии поверх родительских. Главное — логику не нарушай, а то получится пиздопроебибна, а не код.
Короче, перегрузка — это мощный инструмент, чтобы сделать апи удобнее, не заставляя пользователя запоминать кучу разных имён для одной и той же по сути операции. Просто помни про правила, и будет тебе счастье.