Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Получение ссылки на базовый класс при drag&drop


Автор: Kuvaldis 11.2.2008, 12:03
Ребята, всем доброго времени суток!
У меня такая проблема: объекты различных классов перетаскиваются из одного контрола в другой.
При приеме события желательно (даже очень) получить из них объект базового класса, чтобы потом использовать все преимущества полиморфизма, а не кучу блоков 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

Автор: tol05 11.2.2008, 12:29
вместо 
Цитата(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 нужен в данный момент. Так что твои конструкции кода полиморфизм не нарушают.

Автор: Kuvaldis 23.2.2008, 10:52
tol05, 
прав, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)