В языке «1С:Предприятия» нельзя было объявить процедуру/функцию с тем же именем, которое уже существовало у другой процедуры/функции, даже если у них было разное количество параметров.
Теперь в языке «Элемента» можно повторно определить метод с тем же именем, но с разным составом (типом и/или количеством) параметров. Такие методы называются перегруженными.
При этом нужно учитывать, что любой вызов перегруженного метода должен позволять компилятору однозначно определить, какой вариант метода необходимо использовать в данном случае. Перегруженные методы не могут различаться только типом возвращаемого значения. Они должны различаться также и количеством и/или типом параметров.
Например, перегруженный метод (вариант 2) по сравнению с уже существующим (вариант 1) может возвращать значение того же типа Строка, но содержать два параметра вместо одного:
метод МойМетод()
// 1-й вариант
Результат = Метод1("Ок") //Результат: "Ок"
// 2-й вариант
Результат = Метод1(7, "Ок") //Результат: "Ок"
;
// 1-й вариант
метод Метод1(Парам1: Строка): Строка
возврат Парам1
;
// 2-й вариант
метод Метод1(Парам1: Число, Парам2: Строка): Строка
возврат Парам2
;
Или же перегруженный метод (вариант 3) может отличаться от существующего (вариант 1) и типом возвращаемого значения (Число вместо Строка), и количеством параметров (два вместо одного):
метод МойМетод()
// 1-й вариант
Результат = Метод1("Ок") //Результат: "Ок"
// 3-й вариант
Результат = Метод1(7, "Ок") //Результат: 7
;
// 1-й вариант
метод Метод1(Парам1: Строка): Строка
возврат Парам1
;
// 3-й вариант
метод Метод1(Парам1: Число, Парам2: Строка): Число
возврат Парам1
;
Можно также определить перегруженный метод (вариант 2), который будет отличаться от существующего (вариант 1) не количеством, а только типом параметров (Число вместо Строка):
метод МойМетод()
// 1-й вариант
Метод1("Ок")
// 2-й вариант
Метод1(7)
;
// 1-й вариант
метод Метод1(Парам1: Строка)
//Парам1 = "Ок"
;
// 2-й вариант
метод Метод1(Парам1: Число)
//Парам1 = 7
;
Если определить используемый вариант метода во время компиляции не представляется возможным, произойдет ошибка компиляции.
Например, нельзя создать перегруженный метод, у которого тип одного параметра совпадает с типом параметра исходного метода, а второй параметр имеет значение по умолчанию. При компиляции будет получена ошибка неоднозначности, в этом случае любой из методов можно вызвать, указав только один параметр:
//ошибка компиляции – перегрузка метода допускает неоднозначный вызов
метод Метод1(Парам1: Строка)
метод Метод1(Парам1: Строка, Парам2 = 22)
Также нельзя создать перегруженный метод, у которого тип параметра (Строка) является наследником типа параметра исходного метода (Объект):
//ошибка компиляции – перегрузка метода допускает неоднозначный вызов
метод Метод1(Парам1: Объект)
метод Метод1(Парам1: Строка)
Также нельзя создать перегруженный метод, у которого параметр описан с использованием составного типа, при этом в каждом варианте метода в типе параметра присутствует один и тот же тип (Строка):
//ошибка компиляции – перегрузка метода допускает неоднозначный вызов
метод Метод1(Парам1: Строка|Булево)
метод Метод1(Парам1: Строка)
// или
метод Метод1(Парам1: Строка|Булево)
метод Метод1(Парам1: Строка|Число)
Как уже говорилось, нельзя, чтобы перегруженные методы отличались только типом возвращаемого значения:
//ошибка компиляции – перегрузка метода допускает неоднозначный вызов
метод Метод1(Парам1: Число): Строка
метод Метод1(Парам1: Число): Число
Вы можете создать не только перегруженные методы, но и собственные структуры, которые могут иметь несколько конструкторов, различающихся только количеством параметров.