Могу ли я во время выполнения приложения определить, существует
ли класс с именем Tlog?
Используйте в модуле TLog RegisterClass( TLog ) или потомка TLog, затем
FindClass( 'TLog' ) или FindClass( 'TLogSubclass' ) для получения ссылки на
класс в вызывающем модуле, позволяя тем самым пользоваться объектами данного
класса. Вы также могли бы добавить классовый метод, возвращающий существующий
экземпляр или NIL, или который создает и возвращает новый экземпляр при
отсутствии текущего.
Самое необходимое, что нужно сделать, это создать абстрактный, чисто
виртуальный базовый класс TLog, и TLogSubclass, реально наполненный
функциональным назначением. Вызывающему оператору необходимо знать всего лишь о
TLog, а не о TLogSubclass, чтобы получить доступ к его методам и свойствам.
Тем не менее, я считаю не лучшим решением технологию поиска класса по его
имени. Вот что предлагаю я:
|
|
unit LogUnit ;
interface
type
TLog = class
public
constructor Create ;
procedure LogMessage( const Message : string
) ; virtual ; abstract ;
end ; var Log : TLog
;
implementation
constructor TLog.Create
; begin
Log := Self ; end ;
procedure TidyUp ;
far ; begin
Log.Free ; end ;
initialization
AddExitProc( TidyUp ) ; end.
|
|
|
unit LogImpl
;
interface
implementation
uses Log
;
type
TLogImplementation = class( TLog )
public
procedure LogMessage( const Message : string ) ;
override ;
end ; procedure
TLogImplementation.LogMessage( const Message : string )
; begin
{ записываем сообщение в журнальный файл
} end ;
initialization
TLogImplementation.Create ; end.
|
Обратите внимание на то, что здесь используются "скрытые" данные - класс
TLogImplementation объявлен внутри секции реализации модуля LogImpl, поэтому
никакой другой модуль их не видит. Фактически, интерфейсная часть полностью
пустая! Вы можете протестировать это, изучив Log и увидев NIL в самом начале.
Кроме того, вы могли бы иметь ничего не делающий TLog.LogMessage. Затем вы
могли бы создать экземпляр TLog в секции инициализации модуля LogUnit.pas, и
освобождать его перед созданием экземпляра TLogImplementation в LogImpl.pas.
Таким образом, для подключения к приложению класса, нужно просто добавить к
проекту модуль LogImpl.
- Mike Scott |