Override;
function IsClear(const V: TVarData): Boolean; override; procedure Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean); Override; procedure Cast(var Dest: TVarData; const Source: TVarData); Override; procedure CastTo(var Dest: TVarData; const Source: TVarData; const AVarType: TVarType); Override; procedure BinaryOp(var Left: TVarData; const Right: TVarData; const Operator: TVarOp);override; procedure UnaryOp(var Right: TVarData; const Operator: TVarOp); Override; function CompareOp(const Left: TVarData; const Right: TVarData; const Operator: Integer): Boolean; Override; procedure Streamin(var Dest: TVarData; const Stream: TStream); procedure StreamOut(const Source: TVarData; const Stream: TStream); End; Обратите внимание: класс TComplexVariantType - интерфейсный (см. п. 9.4.1). Помимо общих для варианта методов он реализует также два метода, специфичных для интерфейса Ivarstreamabie -Streamin и StreamOut, с помощью которых значения нового интерфейса сохраняются в потоке и считываются из него. Задача этого класса - дать единообразные команды, способные интерпретироваться объектом vcomplex как команды преобразования типа хранящихся данных, их сравнения, реализации над ними тех или иных операций, наконец, записи их в поток и чтения из него. Например, метод cast этого класса вызывается для преобразования других типов значений к комплексному типу, метод castTo - для обратного преобразования, метод BinaryOp реализует бинарную операцию, a Unarydp - унарную и т. д. Еще раз подчеркну, что основная работа (например, по выполнению бинарных операций) реализуется методами класса TComplex-Data. Класс TCompiexVariantType перекрывает абстрактные методы своего родителя, подключая TComplexData к решению той или иной проблемы. Поскольку для создания экземпляра нового варианта необходим уже готовый экземпляр (объект) класса TCompiexVariantType, он создается в секции инициализации модуля varcmpix и уничтожается в завершающей секции: Initialization ComplexVariantType:= TCompiexVariantType.Create; Finalization FreeAndNil(ComplexVariantType); 10.5.3. Создание вспомогательных методов Несмотря на интенсивное использование классов TCompiexData и TCompiexVariantType, эти классы в конечном счете остаются скрытыми от пользователя нового варианта за счет набора вспомогательных методов, таких как VarComplexCreate, VarIsComplex, VarAsComplex и т. п., которые преобразуют обычные процедурные вызовы в вызовы методов и обращения к свойствам соответствующих классов.
Под файлом понимается именованная область внешней памяти ПК (жесткого диска, гибкой дискеты, диска CD-ROM). Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Object Pascal, кроме файлов. Иными словами, нельзя создать “файл файлов”. В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти. Файловый тип можно задать одним из трех способов: <имя> = File of <тип>; <имя> = TextFile; <имя> = File; Здесь <имя> - имя файлового типа (правильный идентификатор); File, of - зарезервированные слова (файл, из); TextFile - имя стандартного типа текстовых файлов; <тип> - любой тип Object Pascal, кроме файлов. Например: Type Product = record Name: String; Code: Word; Cost: Comp end; TextSO = File of String[80]; var Fl: File of Char; F2: TextFile; F3: File; F4: TextSO; F5: File of Product; В зависимости от способа объявления можно выделить три вида файлов:
В наших примерах f1, F4 и F5 - типизированные файлы, F2 - текстовый файл, F3 - нетипизированный файл. Вид файла, вообще говоря, определяет способ хранения в нем информации. Однако в Object Pascal нет средств контроля вида ранее созданных файлов. При объявлении уже существующих файлов программист должен сам следить за соответствием вида объявления характеру хранящихся в файле данных.
|