Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Определение наследника класса по имени - аналог IS

Delphi , Компоненты и Классы , Классы



Автор: Игорь Шевченко
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Определение наследника класса по имени (аналог IS)

Зависимости: SysUtils
Автор:       Игорь Шевченко, whitefranz@hotmail.com, Москва
Copyright:   Игорь Шевченко
Дата:        13 мая 2002 г.
***************************************************** }

{ Возвращает true, если класс порожден от класса с именем Name }
{ Код не требует привязки к RTTI определяемого класса (не надо unit, где описан
класс в uses указывать :-) }

function HSClassBasedOn(Value: TClass; const Name: string): Boolean;
begin
  Result := false;
  while Value <> nil do
  begin
    if SameText(Value.ClassName, Name) then
    begin
      Result := true;
      Exit;
    end;
    Value := Value.ClassParent;
  end;
end;

Программный код на Delphi!

Обзор функции HSClassBasedOn:

Цель: Функция determines, если класс (Value) основан на (то есть наследуется от) другого класса с конкретным именем (Name). Это похоже на ключевое слово IS в других языках.

Implementation:

Функция принимает два параметра:

function HSClassBasedOn(Value: TClass; const Name: string): Boolean;
  1. Она инициализирует переменную результата в false, указывая, что не было найдено совпадения.
  2. Функция затем проходит по иерархии классов с помощью цикла while, начиная от заданного класса Value.
  3. В каждом шаге она проверяет, если имя текущего класса соответствует желаемому Name. Если это так, результат устанавливается в true, и функция выходит из цикла с помощью оператора Exit.
  4. Если не было найдено совпадения, функция продолжает движение к родительскому классу, присваивая Value.ClassParent Value.

Пример использования:

Предположим, у вас есть иерархия классов следующего вида:

type
  TAnimal = class { ... }
    TCat = class(TAnimal) { ... }
    TDog = class(TAnimal) { ... }

function HSClassBasedOn(Value: TClass; const Name: string): Boolean;
begin
  Result := false;

  if HSClassBasedOn(TCat, 'TAnimal') then
    WriteLn('TCat is based on TAnimal');

  if HSClassBasedOn(TDog, 'TAnimal') then
    WriteLn('TDog is based on TAnimal');
end.

В этом примере функция HSClassBasedOn возвращает true для обоих классов TCat и TDog, поскольку они оба наследуются от TAnimal.

Alternative solution:

Хотя эта реализация работает, вы можете рассмотреть более эффективный подход, используя функции RTTI (Run-Time Type Information) Delphi. Вот альтернативная реализация:

function HSClassBasedOn(Value: TClass; const Name: string): Boolean;
begin
  Result := GetClassInfo(TypeInfo(TValue), ciName) = Name;
end.

В этом варианте мы используем функцию GetClassInfo для получения информации о классе для заданного типа Value. Затем мы проверяем, если свойство ciName (которое содержит имя класса) соответствует желаемому Name. Этот подход более компактен и эффективен, чем оригинальная реализация.

В целом, этот код-снippet предоставляет полезную утилитарную функцию для определения, является ли класс наследником другого класса на основе его имени.

Функция HSClassBasedOn позволяет определить наследника класса по имени, не требуя привязки к RTTI определяемого класса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Классы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:38:13/0.0033271312713623/0