Анонс обучающего курса на платформе Stepik
В языке PascalАВС.NЕТ при описании формальных параметров подпрограммы в качестве типа можно указать интерфейс. В самом деле, и класс, и интерфейс - это типы данных, так что ничего необычайного тут нет. Но, указав интерфейс, мы можем придать подпрограмме некоторую универсальность. Хотим работать с индексами (массивы, списки) - указываем интерфейс IList, не хотим (но при этом еще и с последовательностями можно работать) - указываем IEnumerable.
function Exotic(x: IEnumerable<integer>): real;
begin
Result := 0.0;
foreach var a in x do
Result += a ** 2;
Result := Sqrt(Result)
end;
begin
var s := Seq(3, 4, 5);
Println(Exotic(s));
var a := |3, 4, 5|;
Println(Exotic(a));
var L := Lst(3, 4, 5);
Println(Exotic(L));
end.
{
7.07106781186548
7.07106781186548
7.07106781186548
}Посмотрите: наша функция охотно принимает в качестве параметра и последовательность, и массив, и список!
А нельзя ли написать такую же функцию, которая еще и тип T будет обрабатывать с тем, чтобы при конкретном обращении к ней происходило инстанцирование типа? С параметром IEnumerable<T>. Можно. Но оставим такую задачу для модуля с ООП. В конце-концов, должна же быть в курсе какая-то интрига?