Могу ли я во время выполнения приложения определить, существует ли класс с именем 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 [000991]