procedure operator+=<T>(var a: array of T; b: array of T); extensionmethod := a := a + b;
procedure operator+=<T>(var a: array of T; b: array of T); extensionmethod := a := b;
begin
var a := Arr(1,2,3);
var b := Arr(4,5,6);
a += b;
writeln(a);
end.
Выведет результат первой перезагрузки оператора +=, вторую просто проигнорирует. По логике должно было или вызвать ошибку или использовать последнюю перезагрузку.
Наверное первым в голову приходит что такое надо запретить, но возможно это и не так однозначно. У кого какие мысли по этому поводу?
Я сам считаю что надо разрешить и вызывать последнюю перезагрузку, тогда можно делать так:
procedure operator+=<T>(var a: SomeType; b: SomeType2); extensionmethod;
begin
//первый способ складывать SomeType и SomeType2
end;
type
ClassWithCalcType1=class
//какое то использование перезагруженной операции
end;
procedure operator+=<T>(var a: SomeType; b: SomeType2); extensionmethod;
begin
//второй способ складывать SomeType и SomeType2
end;
type
ClassWithCalcType2=class
//какое то использование новой перезагруженной операции
end;
Конечно, такое можно реализовать создав под каждый из таких классов отдельный модуль, но так ведь удобнее.
Допустим, я хотел перегрузить оператор += и -=, но по ошибке написал дважды перегрузку для +=. Если компилятор будет допускать множественную перегрузку, то мне придётся потратить какое то время на поиск такой опечатки. Но если будет ошибка компиляции, то я сразу исправлю код.