В Delphi можно написать:
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);
Ответы на это в следующий раз!