Читаем Описание языка PascalABC.NET полностью

...

var x: array of real;

begin

SetLength(x,3);

x[0] := 1;

x[1] := 2.71;

x[2] := 3.14;

writeln(FindFirstInArray(x,1));

end.

произойдет ошибка. Причина состоит в том, что первый параметр имеет тип array of real, а второй - тип integer, что не соответствует ни одному типу T в заголовке обобщенной функции. Для решения проблемы следует либо изменить тип второго параметра на real:

FindFirstInArray(x,1.0)

либо явно после имени функции в угловых скобках указать имя типа, которым параметризован данный вызов:

FindFirstInArray&(x,1)

Использование знака & здесь обязательно, поскольку в противном случае компилятор трактует знак < как <меньше<.

Обобщёнными могут быть не только обычные подпрограммы, но и методы классов, а также методы другого обобщённого класса. Например:

type

Pair = class

first: T;

second: Q;

function ChangeSecond(newval: S): Pair;

end;

function Pair.ChangeSecond(newval: S): Pair;

begin

result := new Pair;

result.first := first;

result.second := newval;

end;

var

x: Pair;

y: Pair;

begin

x := new Pair;

x.first := 3;

y := x.ChangeSecond('abc');

writeln(y.first, y.second);

end.

По окончании работы данная программа выведет 3abc.

<p>Обобщенные подпрограммы в качестве параметров</p>

Обобщенная подпрограмма может выступать в качестве формального параметра другой обобщенной подпрограммы.

Например, в классе System.Array имеется несколько статических обобщенных методов с обобщенными подпрограммами в качестве параметров. Так, System.Array.Find имеет следующий прототип:

System.Array.FindAll(a: array of T; pred: Predicate): array of T;

и возвращает подмассив массива a элементов T, удовлетворяющих условию pred.

Приведем пример вызова этой функции:

function f(x: integer): boolean;

begin

Result := ;

end;

var a := Seq(1,3,6,5,8);

var b := System.Array.FindAll(a,x -> x mod 2 = 0);

Здесь возвращается массив b, содержащий все четные значения массива a в том же порядке.

<p>Ограничения на параметры обобщенных подпрограмм и классов</p>

По умолчанию с переменными, имеющими тип параметра обобщенного класса или подпрограммы, внутри методов обобщённых классов и обобщенных подпрограмм можно делать лишь ограниченный набор действий: присваивать и сравнивать на равенство (отметим, что в NET сравнение на равенство внутри обобщений запрещено!).

Например, данный код будет работать:

function Eq(a,b: T): boolean;

begin

Result := a = b;

end;

Можно также использовать присваивание переменной, имеющей тип параметра обобщенного класса или подпрограммы, значение по умолчанию, используя конструкцию default(T) - значение по умолчанию для типа T (nil для ссылочных типов и нулевое значение для размерных типов):

procedure Def(var a: T);

begin

a := default(T);

end;

Однако, данный код

function Sum(a,b: T): T;

begin

Result := a + b;

end;

вызовет ошибку компиляции до инстанцирования (создания экземпляра с конкретным типом). Такое поведение в .NET кардинально отличается от шаблонов в C++, где в коде шаблона можно использовать любые операции с шаблонными параметрами, и ошибка может произойти только в момент инстанцирования с конкретным типом.

Чтобы разрешить использование некоторых действий с переменными, имеющими тип параметра обобщенного класса или подпрограммы, используются ограничения на обобщенные параметры, задаваемые в секции where после заголовка подпрограммы или класса:

type

MyPair = class

where T: System.ICloneable;

private

x,y: T;

public

constructor (x,y: T);

begin

Self.x := x;

Self.y := y;

end;

function Clone: MyPair;

begin

Result := new MyPair(x.Clone,y.Clone);

end;

end;

В секции where через запятую перечисляются следующие ограничения:

На 1 месте: слово class или слово record или имя класса-предка.

На 2 месте: список реализуемых интерфейсов через запятую.

На 3 месте: слово constructor, указывающее, что данный тип должен иметь конструктор по умолчанию.

При этом каждое из мест, кроме одного, может быть пустым.

Для каждого типа-параметра может быть своя секция where, каждая секция where завершается точкой с запятой.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных