type HexString = string;
Так мы отметим специальный тип строк, который хранит в себе hex. Но для компилятора они ничем не отличаются от обычных. Вот это скомпилируется нормально:var a: HexString;
b: string;
begin
a := b;
end;
Что, если мы не хотим разрешать такое копирование? (А обычно мы должны не хотеть! Разные по смыслу вещи нельзя присваивать, это опасно). Компилятор можно попросить создать "независимый тип":type HexString = type string;
Теперь строку типа HexString нельзя присвоить строке типа string, и наоборот.Похожий приём работает с классами, только чуть иначе.
type
HexStringList = TStringList; //можно присваивать HexStringList -> StringList и обратно!
HexStringList = class(TStringList); //можно присваивать только HexStringList -> StringList, но не обратно!
Классы, в отличие от простых типов, поддерживают наследование. Более "частный" класс можно положить в переменную более общего, но не наоборот. Если мы объявляем тип без "class
", то мы просто создаём для него другое имя: оба типа на самом деле одно и то же. А с помощью "class(TStringList)
" мы говорим компилятору "HexStringList - это частный случай StringList, он от него наследует".Но что, если мы напишем так?
type HexStringList = type TStringList;
Или так?type HexStringList = type class(TStringList);
Ответы на это в следующий раз!