Similar presentations:
презентация_перегрузка_методов_новый_дизайн (1)
1.
ПерегрузкаМетодов
Разработка программных модулей
Выполнил: Лужиков Михаил Николаевич 1415-Исо
Сыктывкарский Государственный Университет им.
Питирима Сорокина
Колледж Экономики Права и Информатики
Преподаватель: Хохлов Роман Николаевич
2.
Зачем нужна перегрузка методовБез перегрузки
• много похожих имён методов
• пользователь запоминает
лишние названия
• интерфейс класса
становится шумным
printInt(value)
printString(text
)
printDouble(num)
С перегрузкой
• одно имя для одной идеи
• параметры уточняют вариант
• компилятор выбирает
нужный метод
print(int)
print(String)
print(double)
Главная польза
Код становится ближе к
естественному языку:
действие одно, а форма
входных данных может быть
разной.
читабельность
меньше
имён
2
3.
Метод, параметры и сигнатураМетод
Параметры
Сигнатура
именованный блок команд,
который выполняет действие
входные данные метода:
количество, типы и порядок
имя метода + список параметров
area(int side)
area(int width, int height)
area(double radius)
количество параметров
да
тип параметра
да
порядок параметров
да, но осторожно
только возвращаемый тип
нет
3
4.
Перегрузка как статический полиморфизмВызов
sum(2, 3)
Методы
кандидаты
Применимые
по параметрам
Лучший
sum(int,int)
Почему статический?
Плюс
Риск
выбор зависит от объявленных типов
аргументов и выполняется при
компиляции
ошибки с неподходящими
аргументами видны до запуска
программы
похожие типы и преобразования
могут сделать выбор
неочевидным
4
5.
Перегрузка и переопределениеПерегрузка
Переопределение
• одно имя, разные параметры
• наследование не обязательно
• выбор на этапе компиляции
• цель: удобство вызова
• тот же метод в подклассе
• наследование обязательно
• часто выбор во время выполнения
• цель: специализация поведения
print(int value)
print(String text)
class Dog extends Animal {
speak() { ... }
}
5
6.
Правила объявления перегруженных методовМожно различать
Нельзя различать только по
• количество параметров
• типы параметров
• порядок параметров — осторожно
• возвращаемому типу
• именам параметров
• модификаторам доступа
• списку исключений
void log(String text)
void log(Exception error)
int read()
String read()
Главный критерий качества: все варианты должны сохранять общий смысл операции.
6
7.
Пример Java: метод sumclass Calculator {
int sum(int a, int b) {
return a + b;
}
int sum(int a, int b, int c) {
return a + b + c;
}
sum(2, 3)
sum(int, int)
sum(2, 3, 4)
sum(int, int, int)
sum(2.5, 3.1)
sum(double, double)
double sum(double a, double b) {
return a + b;
}
}
Смысл: компилятор выбирает нужный метод по
числу и типам аргументов.
7
8.
Пример C#: форматирование сообщенийЧто показывает код
class MessageFormatter {
string Format(string text) {
return $"Сообщение: {text}";
}
string Format(int number) {
return $"Число: {number}";
}
string Format(string name, int score) {
return $"{name}: {score}";
}
один смысл — формирование текста; входные
данные разные
Важно
перегрузки должны оставаться понятными, особенно
вместе с необязательными параметрами
}
Когда полезно
• форматирование и логирование
• конструкторы и фабрики
• работа с файлами и коллекциями
8
9.
Конструкторы, операторы и параметры по умолчаниюclass Rectangle {
Rectangle() {
this(1, 1);
}
Rectangle(int side) {
this(side, side);
}
Rectangle(int w, int h) {
...
}
}
Rectangle()
Rectangle(side)
Rectangle(w,h)
Идея: короткие варианты часто делегируют работу полному
варианту. Так меньше дублирования и меньше ошибок.
Параметры по умолчанию частично заменяют перегрузку, но не всегда
делают интерфейс понятнее.
9
10.
Как компилятор выбирает перегрузку1
Найти методы
2
с нужным именем
Оставить
доступные
3
и подходящие по числу
Проверить типы
и преобразования
точное совпадение
обычно лучший выбор
int → long / double
возможно расширение типа
null подходит к нескольким типам
может быть неоднозначность
несколько одинаково подходящих методов
ошибка компиляции
4
Выбрать наиболее
точный вариант
10
11.
Типичные ошибки при перегрузкеНеоднозначность null
Только результат
show(String) и show(Integer): вызов show(null) непонятен
компилятору.
int get() и String get() не являются корректными перегрузками.
Разный смысл
Слишком много вариантов
open(path) и open(port) могут запутать: лучше уточнить имена.
длинный список перегрузок усложняет выбор и документацию.
void show(String text)
void show(Integer number)
show(null);
// какой метод?
show((String) null);
11
12.
Практическое применениеКонструкторы
Форматирование
создание объектов разными способами
один метод для разных типов данных
Логирование
Чтение файлов
сообщение, ошибка или оба параметра
путь, файл, поток или массив байтов
Перегрузка полезна там, где одна логическая операция принимает разные формы входных
данных.
12
13.
Чек-лист хорошей перегрузки1
единый смысл
2
все варианты относятся к одной операции
3
единый порядок
различие видно по типам или количеству
4
аргументы не меняются местами без причины
5
меньше дублирования
короткие методы вызывают более полный вариант
ясные параметры
нет неоднозначности
null, числа и varargs не создают спорных вызовов
6
документация
пользователь понимает, когда какой вариант нужен
13
14.
ВыводЧто даёт перегрузка
• одно имя для одной логической операции
• удобные варианты вызова
• меньше искусственных названий методов
• ранняя проверка ошибок компилятором
Что важно помнить
Перегрузки должны быть понятными, не
создавать неоднозначности и сохранять
общий смысл операции.
14
programming