Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение ссылки на базовый класс при drag&drop 
:(
    Опции темы
Kuvaldis
  Дата 11.2.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Ребята, всем доброго времени суток!
У меня такая проблема: объекты различных классов перетаскиваются из одного контрола в другой.
При приеме события желательно (даже очень) получить из них объект базового класса, чтобы потом использовать все преимущества полиморфизма, а не кучу блоков if.
Но проблема в том, что для получения объекта мне приходится использовать проверку на тип вида

e.Data.GetDataPresent(typeof(InvComputer)) 

Соотвественно, весь полиморфизм - коту под хвост.
Как выкрутиться?

При посылке:
Код

TreeNetworkBrowser.DoDragDrop(dragNode.Tag, DragDropEffects.All | DragDropEffects.Link);


Базовый класс InvComputer, дочерний - InvComputerPE

При приеме:
Код

        private void OnServerDragDrop(object sender, DragEventArgs e)
        {       
            // здесь хотелось бы только одну проверку
                   
            if (e.Data.GetDataPresent(typeof(InvComputer)) ||

                e.Data.GetDataPresent(typeof(InvComputerPE)))
            {
                if (e.Effect == DragDropEffects.Copy)
                {
                    // здесь тоже - чтобы работало для любых типов, а не только для базового InvComputer 
                    InvComputer computer = (InvComputer)e.Data.GetData(typeof(InvComputer));

                    if (sender == bannerSourceServer)
                    {
                        string message;
                        if(CanTranslate(computer, out message))      // в этой функции уже разбор конкретного типа и полиморфное поведение
                        {
                            SetSourceServer(computer);
                        }
                        else
                        {                           
                            InvMessageBox.ShowError(this, message);
                        }                        
                    }
                    else if (sender == bannerTargetServer)
                    {
                        SetTargetServer(computer);
                    }
                }
            }
        }


В общем, прошу совета smile


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
tol05
Дата 11.2.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



вместо 
Цитата(Kuvaldis @  11.2.2008,  11:03 Найти цитируемый пост)
if (e.Data.GetDataPresent(typeof(InvComputer)) 

я бы использовал конструкцию вида
Код

InvComputer invComputer = e.Data.GetDataPresent(typeof(InvComputerPE) as InvComputer;
//InvComputer invComputer = e.Data as InvComputer; не знаю получится ли так
if(invComputer != null)
{
//вызов членов invComputer или invComputerPE, через каст к InvComputerPE
}

насчет проверки на базовый и дочерний... Если объект совместим с InvComputerPE, то он будет совместим и с InvComputer, ведь InvComputerPE - это наследник InvComputer?
Так что проверку на базовый класс делать не нужно. 

А насчет полиморфизма... Проверки на совместимость с тем или иным типом делать все равно нужно. И нужно указать какой из "тех или иных" smile нужен в данный момент. Так что твои конструкции кода полиморфизм не нарушают.

Это сообщение отредактировал(а) tol05 - 11.2.2008, 12:31


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Kuvaldis
Дата 23.2.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



tol05
прав, спасибо!


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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