Как определить тип реализующего объекта интерфейса - PullRequest
3 голосов
/ 04 марта 2011

Я пытаюсь написать модульный тест для простого фабричного класса, который создает один из нескольких возможных реализующих объектов и возвращает его как ссылку на интерфейс.

DUnit имеет встроенную процедуру CheckIs(AObject: TObject; AClass: TClass; msg: string), которая на основе своего имени и параметров, которые он принимает, должна провалить тест, если тип класса объекта не соответствует ожидаемому. Единственная проблема заключается в том, что требуется ссылка на объект, а не ссылка на интерфейс.

Поэтому я пытаюсь использовать CheckTrue и выполнить сравнение в теле теста, но я не так знаком с поддержкой проверки типов Delphi, как я с C #.

Я знаю, что оператор is не может быть и речи, поскольку он работает только со ссылками на объекты.

CheckTrue(LMyInterfaceReference {comparison here} TMyClass);

Есть предложения?

Кстати, я использую Delphi 2009, поэтому у меня нет доступа к новой поддержке RTTI, добавленной в 2010 +.

Ответы [ 3 ]

4 голосов
/ 04 марта 2011

Если вам не нравятся хаки и вы не хотите переходить на Delphi 2010+, вы можете использовать такой интерфейс:

IImplementingObjectInterface = interface
  function GetImplementingObject: TObject;
end;

Убедитесь, что ваши объекты также реализуют этот интерфейс, и используйте его дляизвлечь объект реализации.Если вам нужно сделать это для большого количества объектов, вы можете определить свой собственный TInterfacedObject производный, который уже реализует это, так что вы можете просто изменить свое наследование и все готово.

4 голосов
/ 04 марта 2011

Мне интересно, почему вы ДОЛЖНЫ проверить это ... может быть, вам действительно не нужно.

Но если знание базового объекта интерфейса является обязательным, у вас есть два варианта:

  • Добавьте метод к интерфейсу, который возвращает базовый объект, просто объект TObject, и реализуйте его в каждом классе, просто возвращая self.
  • Немного взломать, например, используя эту Интерфейс к объекту подпрограмма.
1 голос
/ 05 марта 2011

Барри Келли (один из главных инженеров Embarcadero Delphi Compiler) написал замечательную Уродливую альтернативу интерфейсу приведения объектов на этой неделе.

Он отвечает вашимвопрос.

Самое забавное, что Hallvard Vassbotn написал очень похожий фрагмент кода еще в 2004 году .

Начиная с Delphi 2010, вы можете просто использовать проверку is или as для возврата от ссылок на интерфейсы к ссылкам на объекты.

- jeroen

...