Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Соответствие интерфейсам 
:(
    Опции темы
Keeper89
Дата 27.1.2012, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Доброго времени суток.

Имеется следующая задача.
Есть
  • несколько интерфейсов, IA, IB, IC. 
  • M - менеджер, который для каждого интерфейса хранит данные (типо словаря).
  • объекты, реализующие интерфейсы, TA, TB, TC.
  • K - список объектов TA, TB, TC (обычный список).
Вопрос в следующем. В цикле идет перебор элементов списка K, в котором нужно удобным способом получать соотв. данные из менеджера M.
Пример:
  • Получаем на шаге цикла TA.
  • Каким-то образом нужно получить данные из M(TA), зная, что TA реализует IA.

З.Ы. Delphi XE2, поэтому использование нововведений очень приветствуется.

Это сообщение отредактировал(а) Keeper89 - 27.1.2012, 13:30


--------------------
PM MAIL WWW   Вверх
bems
Дата 27.1.2012, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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

Добавлено через 6 минут и 49 секунд
Не лучше ли будет возложить получение данных на метод класса?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Keeper89
Дата 27.1.2012, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



bems, грубо говоря хочется сделать что-то такое:
Код

for kk in K do
begin
    for mm in M.Keys do
    begin

        if Supports(kk, mm, Intf) then
        begin
            // тут делаем что-то с приведенным Intf

            Break;
        end;
    end;
end;

Причем K - список этих интерфейсов (List<IABC>), а M (TDictionary<TGUID, IABC>) - таблица. Т.е. нужно найти kk в M.Keys, и работать дальше с M.Values.

Добавлено @ 14:38
Цитата(bems @  27.1.2012,  13:52 Найти цитируемый пост)
можно переделать список в список интерфейсов (объявить элемент как базовый для всех трёх интерфейсов, например IInterface) 

Базовый интерфейс есть.

Добавлено @ 14:38
Цитата(bems @  27.1.2012,  13:52 Найти цитируемый пост)
искать в менеджере информацию для каждого элемента.

Это как?

Это сообщение отредактировал(а) Keeper89 - 27.1.2012, 15:57


--------------------
PM MAIL WWW   Вверх
MetalFan
Дата 27.1.2012, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Keeper89 @  27.1.2012,  13:25 Найти цитируемый пост)
Каким-то образом нужно получить данные из M(TA), зная, что TA реализует IA.

хм, как-то или все очевидно или я не понял задачи...
по TA получаем IA, по IA получаем данные из М. Если М недоступен изначально, то добавляем ссылку на M в IA.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Keeper89
Дата 27.1.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



MetalFan, если бы очевидно, я бы  не спрашивал smile

В коде выше через Supports я могу получить поддерживаемый интерфейс (из Dictionary), но вот как его привести к нему после проверки - понять не могу. Ведь Intf объявляется как базовый интерфейс, а не конкретный найденный.

Можно даже переделать как-то так:
Код

for kk in K do
begin
  if not M.ContainsKey(kk) then
    Continue;

  (M[kk] as kk).DoAction;
end;


Может это все не стоит делать и ограничиться большим куском типа:
Код

var
  AInt: AI;
  BInt: BI;
  CInt: CI;

for kk in K do
begin
    for mm in M.Keys do
    begin
        if Supports(kk, mm, AInt) then
        begin
            AInt.DoAction;
            Break;
        end

        else if Supports(kk, mm, BInt) then
        begin
            BInt.DoAction;
            Break;
        end

        else if Supports(kk, mm, CInt) then
        begin
            CInt.DoAction;
            Break;
        end;
    end;
end;

Он мне, ес-но не нравится, поэтому и завел речь о том, что идет выше.

Это сообщение отредактировал(а) Keeper89 - 27.1.2012, 17:10


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.