Вопрос по массивам и последовательностям.


#1

Если первый Println переводит массив в последовательность, а он переводит ибо попробуйте написать какой-нибудь цикл for по индексам элементов массива, - не получится, а вот цикл foreach по элементам последовательности запросто. Тогда почему второй и последующие Println выводит одинаковые значения? Снимок

Ведь если бы это была чистая последовательность по SeqRandomInteger, например, то так бы и было. Снимок2


#2

ArrRandomInteger создаёт массив, то есть набор значений а не алгоритм их нахождения. А первый Println оставляет массив массивом но записывает его в переменную типа последовательности. Они совместимы потому что массив это наследник последовательности.


#3
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, понятно почему?


#4

Вообще нет, я плохо объяснил, давайте ещё раз попробую.

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 - они будут вести себя по разному.