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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как прикрутить Decorator к контролам? 
:(
    Опции темы
Alek86
Дата 19.9.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 25



вопрос, опять же, в самом названии.
Для применения паттерна Decorator к контролам требуется единый интерфейс для всех моих контролов. А, как я посмотрел, Control в шарпе является реализацией многих интерфейсов, большинство из которых мне не очень понятны :(

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
ivashkanet
Дата 19.9.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Alek86, что-то мне кажется ты путаешь понятия интерфейса в архитектуре и  интерфейса в шарпе. Первое это все то, что торчит из класса наружу (все паблик поля, свойства, методы и события, ...), а второе это конструкция в Шарпе, которая частично решает проблему множественного наследования.

В Шарпе все контролы имеют один общий интерфейс (в понятии архитектуры) доставшийся им от их родителя -- класса Control. Поэтому легко применить этот паттерн.



PM MAIL WWW ICQ   Вверх
Alek86
Дата 19.9.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 25



не очень понял :(

если есть у меня кнопка (Button) и нужно сделать:
1) кнопку, которая "светится" при наведении на нее мышкой
2) кнопку, которой можно менять цвет правой кнопкой мыши


в связи с этим несколько вопросов:

1. Как требуется реализовать подобное?

Код


class LightButton : Button {
//  ...
//  реализация
    Button m_Button;
}


class ColorButton : Button {
//  ...
//  реализация
    Button m_Button;
}



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


2. Если описанное в первом вопросе не полный бред, то как узнать, что я переписал ВСЕ методы и свойства, присущие кнопке?


3. Если первые два вопроса совсем уж непонятны, то как бы вы реализовали эти кнопки с помощью декоратора?

Это сообщение отредактировал(а) Alek86 - 19.9.2007, 11:48


--------------------
user posted image    user posted image
PM MAIL   Вверх
ivashkanet
Дата 19.9.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Цитата(Alek86 @  19.9.2007,  11:32 Найти цитируемый пост)
если есть у меня кнопка (Button) и нужно сделать:

Если у тебя только Button (или Button и ещё несколько контролов, но не много) и всего две функциональности, то лучше сделать двух наследников кнопки, которые будут работать так как тебе это нужно!

Декоратора, вообще, нужно использовать только там где без него нельзя. Потому, что этот паттерн всегда влечёт за собой усложнение конечного кода.
Цитата(Alek86 @  19.9.2007,  11:32 Найти цитируемый пост)
так?

Да. Только я не не совсем уверен что скрывается под словом "реализация". У каждого она будет своя.
Цитата(Alek86 @  19.9.2007,  11:32 Найти цитируемый пост)
причём нужно не забыть ни единого

Это недостаток Декоратора и от него никуда не денешься. Тем более тобою выбран объект с очень богатым интерфейсом.
Цитата(Alek86 @  19.9.2007,  11:32 Найти цитируемый пост)
я переписал ВСЕ методы
 
В VS 2005 пишешь "override", нажимаешь пробел и смотришь что осталось ;-)

P.S. Есть ещё такое понятие как динамический прокси (гугл дал ссылку только на жаву, но суть от этого не меняется) . Что-то типа такого можно попытаться применить в данном случае.
PM MAIL WWW ICQ   Вверх
Alek86
Дата 19.9.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 25



ну, насчет "лучше сделать двух наследников кнопки" не совсем согласен так как 100% понадобится кнопка, что умеет делать и то и другое


насчет остального спасибо за ответ smile

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


блин. пока писал это, сомнение закралось...
может, есть все же в шарпе механизм, с которым даже ivashkanet не знаком?
smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
ivashkanet
Дата 19.9.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Цитата(Alek86 @  19.9.2007,  15:03 Найти цитируемый пост)
так как 100% понадобится кнопка, что умеет делать и то и другое

Тогда бы я подумал и все равно использовал бы третий класс smile 
Вот если бы мы имели 4 (и больше) претендента на декораторы и были бы возможны (%-ов на 90) их комбинации, то я бы обратился к декорированию.
Цитата(Alek86 @  19.9.2007,  15:03 Найти цитируемый пост)
так бы унаследовался от какого-то IButton.

И что бы этот интерфейс содержал? То же самое, что и Button. 
Тем более ты используешь методы класса Control (доставшихся Button по праву наследования).
PM MAIL WWW ICQ   Вверх
Alek86
Дата 19.9.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 25



Цитата(ivashkanet @  19.9.2007,  15:10 Найти цитируемый пост)
Тогда бы я подумал и все равно использовал бы третий класс  

можно узнать, каким образом? с помощью копипаста?

Цитата(ivashkanet @  19.9.2007,  15:10 Найти цитируемый пост)
И что бы этот интерфейс содержал? То же самое, что и Button. 


именно. но повторю то же самое:
1. но интерфейс не содержал бы данных, то есть ничего не весил (в моем примере я наследую LightButton от Control только для того, чтобы унаследовать его публичные методы, а все то лишнее, что он с собой принесет - лишь балласт)
2. наследуясь от интерфейса я обязан реализовать все его "паблики". наслдуясь же от класса я ничего подобного делать не обязан, за что могу и поплатиться

разве это не достаточные причины для того, чтобы в языке был продуман механизм интерфйсов контролов?


ЗЫ. Со стороны может покааться, что я затеял спор ради спора, но это не так, я всего лишь хочу "докопаться" до истины, так что буду только рад, если мои аргументы опровергнут или вообще как-то отреагируют
smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
ivashkanet
Дата 19.9.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Цитата(Alek86 @  19.9.2007,  16:23 Найти цитируемый пост)
с помощью копипаста?

 smile 
Тоже вариант
Цитата(Alek86 @  19.9.2007,  16:23 Найти цитируемый пост)
разве это не достаточные причины для того, чтобы в языке был продуман механизм интерфйсов контролов?

Точно! Напиши об этом в Майкрософт ;-) 
Не думаю, что из-за сложностей с декорированием стоит это делать. 
Тем более, что существующая структура, несомненно, более выигрышная ввиду того, что не нужно реализовывать каждый раз код с нуля.

PM MAIL WWW ICQ   Вверх
Alek86
Дата 19.9.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 25



ну чтож.
хотя ответ не тот, на который я надеялся, но спасибо

пойду письмо сочинять smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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