September 9, 2023

Анонс обучающего курса на платформе 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>. Можно. Но оставим такую задачу для модуля с ООП. В конце-концов, должна же быть в курсе какая-то интрига?