Если первый Println переводит массив в последовательность, а он переводит ибо попробуйте написать какой-нибудь цикл for по индексам элементов массива, - не получится, а вот цикл foreach по элементам последовательности запросто. Тогда почему второй и последующие Println выводит одинаковые значения?
Ведь если бы это была чистая последовательность по SeqRandomInteger, например, то так бы и было.
ArrRandomInteger
создаёт массив, то есть набор значений а не алгоритм их нахождения. А первый Println
оставляет массив массивом но записывает его в переменную типа последовательности. Они совместимы потому что массив это наследник последовательности.
type
t1=class//aka sequence
pb:byte;
function GetItself := self;
end;
t2=class(t1)//t2 наследник t1, aka array
procedure WritePB := writeln(pb);
end;
begin
var a := new t2;
a.pb := 1;
var b := a.GetItself;
b.pb := 2;
a.WritePB;
end.
a
имеет тип t2
, b
это a
но с типом t1
. Выведет 2, понятно почему?
Вообще нет, я плохо объяснил, давайте ещё раз попробую.
sequence
это интерфейс, то есть лишь набор правил. К примеру:
type
Animal=interface
procedure Call;
end;
Cat = class(Animal)
procedure Call := writeln('кис кис');
end;
Dog = class(Animal)
procedure Call := writeln('*свист*');
end;
begin
var a: Animal;
a := new Cat; a.Call;
a := new Dog; a.Call;
end.
Когда объявили a
с типом Animal
- оно ещё ни чем не является, но можно быть уверенным что когда этой переменной что то присвоить - она сможет реализовать процедуру Call
. А что именно будет делать Call
зависит от того что присвоили этой переменной.
Когда у переменной тип sequence
- известно что это какая то последовательность, то есть она к примеру реализует функцию MoveNext
. Когда в программе используется, к примеру, SeqRandom
- компилятор создаёт новый тип реализующий sequence
. Переменная этого типа является алгоритмом использующим Random
, поэтому каждый раз она возвращает новые значения.
И массив и этот новый тип реализовывают sequence
, поэтому их экземпляры можно присвоить переменной с типом sequence
. Но когда программа доходит до Println
- они будут вести себя по разному.