Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > как избавиться от копипаста?


Автор: Alek86 29.8.2007, 07:33
вопрос таков. есть у меня 2 контрола, в каждый из которых нужно добавить по одинаковой функции WndProc с абсолютно одинаковым содержимым. К примеру:

Код

    class GlassyLabel : Label {
        protected override void WndProc(ref System.Windows.Forms.Message m) {
            if (m.Msg == Globals.WM_NCHITTEST) m.Result = (IntPtr) Globals.HTTRANSPARENT;
            else base.WndProc(ref m);
        }
    }

и
Код

    class GlassyPictureBox : PictureBox {
        protected override void WndProc(ref System.Windows.Forms.Message m) {
            if (m.Msg == Globals.WM_NCHITTEST) m.Result = (IntPtr) Globals.HTTRANSPARENT;
            else base.WndProc(ref m);
        }
    }



есть ли на шарпе способ, как можно избавиться в таком случае от копипаста тела функций?

Автор: SpaceSpace 29.8.2007, 08:07
наследуй от базового класса с этой функцией, 
либо делегируй этот функционал другому классу

Автор: Alek86 29.8.2007, 08:15
да уж, про наследование я конкретно протупил.... smile

а что за делегирование? можно ссылку? что такое делегаты я представляю, но как их сюда применить...

Автор: SpaceSpace 29.8.2007, 13:11
думаю наследование в данном случае оптимально.

я даже более извращенный способ придумал:
Создаеш статический метод.
и вызываеш его smile
вот и получается - написал 1 раз.
избыточность кода - 1 строка на каждый вызов.

при инаследовании - нет избыточности

а на делегирование можешь забить,
ты же получил ответ на свой вопрос

Автор: Alek86 29.8.2007, 13:41
дело в том, что этот вопрос является частным случаем более извращенного и теоретического.


Допустим, есть "классы" Bird, Horse, Lion и их потомки Pegasus, Manticore, и не существующий в мифологии Lihorse, причем на С++ их можно записать через множественное наследование примерно так (без сохранения синтаксиса):

Pegasus : Bird, Horse
Manticore : Bird, Lion
Lihorse : Lion, Horse

И такие есть у них функции

Pegasus может летать как птица и скакать галопом, как конь
Manticore может летать и рычать, как лев
Lihorse : скакать и рычать

На С++ я могу представить, как это дело реализовать без копипаста (хотя и с проблемами множественного наследования). А вот как это сделать на C# или Java (БЕЗ КОПИПАСТА) представить не могу :(

может, это делегирование может помочь? или есть какой-то неведомый мне способ? smile

Автор: SpaceSpace 29.8.2007, 14:52
зато наследовать МНОГО интерфейсов никто не запрещает.

правда придется делать много копипаста... smile 


Автор: Alek86 29.8.2007, 17:26
Цитата(SpaceSpace @  29.8.2007,  14:52 Найти цитируемый пост)
правда придется делать много копипаста...  


как раз про это мои:

Цитата(Alek86 @  29.8.2007,  13:41 Найти цитируемый пост)
На С++ я могу представить, как это дело реализовать без копипаста (хотя и с проблемами множественного наследования). А вот как это сделать на C# или Java (БЕЗ КОПИПАСТА) представить не могу :(


и


Цитата(Alek86 @  29.8.2007,  13:41 Найти цитируемый пост)
может, это делегирование может помочь? или есть какой-то неведомый мне способ? 


smile

Автор: SpaceSpace 30.8.2007, 07:12
http://www.codeproject.com/cs/design/smip.asp

но это всё-таки правильнее, чем извращаться.

Добавлено через 2 минуты и 45 секунд
там смысл в том, что используеш интерфейсы.
создаеш объект, реализуеш в нем интерфейс.
потом этот объект засовываешь в тот класс, в котором нужно множественное наследование.

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

Если понравилось, ставь плюс, не стесняюся smile 

Автор: Alek86 30.8.2007, 07:18
спасибо. от это ближе к ОНО smile

ибо как я позжее нормально подумал (и такое бывает) с помощью нормального наследования первую задачу решить нельзя

Автор: SpaceSpace 30.8.2007, 11:05
на счет делегирования
приведенный выше паттерн множественного наследования в C#
как раз использует метод другого объекта,
по сути делегирует ему этот функционал

Автор: Alek86 5.9.2007, 10:50
спасибо

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