Дженерики портят отображение имени интерфейса?

Я не эксперт в реализациях языка (поэтому возьмите это с мелкой частицей соли), но я думаю, что одни из самых больших затрат раскручивают стек и хранят его для отслеживания стека. Я подозреваю, что это происходит только, когда исключение выдается (но я не знаю), и если так, это было бы прилично измеренными скрытыми затратами каждый раз, когда исключение выдается..., таким образом, это не похоже на Вас, просто спрыгивают с одного места в коде другому, существует большое продолжение.

я не думаю, что это - проблема, пока Вы используете исключения для ИСКЛЮЧИТЕЛЬНОГО поведения (так не Ваш типичный, ожидаемый путь через программу).

6
задан TrespassersW 11 November 2009 в 23:54
поделиться

2 ответа

поскольку с типом интерфейса использует приведение интерфейса, которое использует GUID для поиска интерфейса. Для универсального интерфейса с идентификатором GUID каждый экземпляр получает один и тот же идентификатор GUID. Если один тип реализует несколько копий интерфейса, то поиск по GUID приведет к возврату первого интерфейса.

Программа работает должным образом, если вы не используете приведение интерфейса, а вместо этого используете преобразование интерфейса, например this:

procedure Test;
var
  t : TTest<integer, string>;
begin
  t := TTest<integer, string>.Create(39, 'Blah');
  ShowMessage(ITest<string>(t).Val);
  ShowMessage(IntToStr(ITest<Integer>(t).Val));
end;

Первоначально, когда универсальные шаблоны реализовывались для Win32, идентификаторы GUID не разрешались в общих интерфейсах. Однако динамические запросы для общих интерфейсов были желательны для общих сценариев контейнеров и в целом в качестве механизма запроса поставщика услуг для конкретных типов услуг в контексте алгоритма (например, сортировки или поиска, которые требуют таких вещей, как компараторы и тесты на равенство). Таким образом, был сформирован новый план: иметь GUID в универсальном интерфейсе, но создать хэш аргументов типа для общих экземпляров и свернуть (например, xor) хэш в GUID, чтобы создать уникальный GUID для каждого отдельного и несовместимого экземпляра. Однако это было поздно, и хорошая реализация была невозможна в сжатые сроки. Но потребность в динамических запросах осталась, поэтому GUID остались. Вот почему все так и есть сегодня.

Для решения вашего конкретного сценария лучшее, что я могу порекомендовать, - это использовать различных потомков с явными GUID; или используйте другой механизм для запроса интерфейса.

но создайте хэш аргументов типа для универсальных экземпляров и сверните (например, xor) хеш в GUID, чтобы создать уникальный GUID для каждого отдельного и несовместимого экземпляра. Однако это было поздно, и хорошее внедрение в сжатые сроки оказалось невозможным. Но требование динамических запросов осталось, поэтому идентификаторы GUID остались. Вот почему все так и есть сегодня.

Лучшее, что я могу порекомендовать для решения вашего конкретного сценария, - это использовать отдельных потомков с явными GUID; или используйте другой механизм для запроса интерфейса.

но создайте хэш аргументов типа для общих экземпляров и сверните (например, xor) хеш в GUID, чтобы создать уникальный GUID для каждого отдельного и несовместимого экземпляра. Однако это было поздно, и хорошая реализация была невозможна в сжатые сроки. Но требование динамических запросов осталось, поэтому идентификаторы GUID остались. Вот почему все так и есть сегодня.

Лучшее, что я могу порекомендовать для решения вашего конкретного сценария, - это использовать отдельных потомков с явными GUID; или используйте другой механизм для запроса интерфейса.

Но требование динамических запросов осталось, поэтому идентификаторы GUID остались. Вот почему все так и есть сегодня.

Лучшее, что я могу порекомендовать для решения вашего конкретного сценария, - это использовать отдельных потомков с явными GUID; или используйте другой механизм для запроса интерфейса.

Но требование динамических запросов осталось, поэтому идентификаторы GUID остались. Вот почему все так и есть сегодня.

Для решения вашего конкретного сценария лучшее, что я могу порекомендовать, - это использовать различных потомков с явными GUID; или используйте другой механизм для запроса интерфейса.

11
ответ дан 8 December 2019 в 17:23
поделиться

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

Это похоже на ошибку, поэтому должно быть сообщается через центр качества.

3
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: