![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
mlitkin |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 10.7.2007 Репутация: нет Всего: нет |
Я понимаю, что уже много чего сказано по этой теме, и что нормального (в понимании программиста, всю сознательную жизнь писавшего на Delphi) наследования в visual studio 2005 нет, НО... Непонятно одно - как с этим со всем жить??? Есть ли какая-то альтернатива наследованию? Кто как обходит эту ситуацию? Поделитесь опытом. Не понимаю, как можно написать более-менее серьезный проект без наследования!?
P.S.: Помогите человеку заново обрести веру в .net-программирование. |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
язык какой ?
c# вполне себе имеет наследование :
в сравнении с Delphi как раз отличий почти нету. в сравнении с с++ есть : нет множественного наследования реализации, нет приватного и защищенного наследования.... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
mlitkin |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 10.7.2007 Репутация: нет Всего: нет |
Я про наследование форм и последующее их редактировании/отображении в дизайнере.
Вот, например: http://www.gotdotnet.ru/Forums/Windows/436460.aspx |
|||
|
||||
vponomarov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 11.8.2007 Где: Киев Репутация: 5 Всего: 12 |
mlitkin, я не знаю как там в 2005-ой студии, но в 2008-ой никаких проблем с визуальным наследием форм нет.
для компонент формы, которые ты хочешь давать изменять потомкам ставишь модификатор доступа protected и без проблем редактируешь их в редакторе. собственно говоря это вполне ожидаемое поведение, такое же как и при наследовании других классов. возможно вы просто не до конца разобрались и в 2005-ой данный вопрос также решается? |
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
не делайте поспешных выводов. Да еще в такой категоричной форме ![]() -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
it_medved |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 1.5.2007 Где: Днепропетровск Репутация: нет Всего: 1 |
гыгыгы сначала почитай любую книжку по C# - наследование имеецо))
а чебы наследоватца от любой формы - тут так же само как и с другого класса:
и все... вобшем сначала думай потом пиши ![]() |
|||
|
||||
IApple |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Не ждите нормального ответа от людей, которіе НЕ работали никогда на Делфи... они никогда не видели по-настоящему удобного дизайнера. Это как при совке не могли себе представить 100 сортов колбасы на прилавке да к тому же без очереди в километр.
Но наследование в С# есть, просто все дочерние компоненты по-умолчанию шарп делает private, поэтому их не должно быть видно (и соответственно невозможно редактировать) в потомках, а "ставишь модификатор доступа protected..." не всегда и не для всех компонентов помогает (например DataGridView в потомках будет закрыт "замочком" даже при выставленом public) Дизайнер студии не умеет с наследованием грамотно работать, поэтому некоторые визуальные компоненты на форме вам нивжисть не изменить в потомках редактором. Ручками в коде - возможно, но грабель там понатыкано... Например, для организации мультиязыковой поддержки стандартным методом является выставлять для формы свойство Localizable=True, потом для каждого языка выбрать соответствующий Language и для каждого визуального компонента на этом языке прописать нужные свойства (Text, к примеру). Соответственно студия создаст для формы набор ресурсных файлов для каждого языка. Но как получить записи в ресурсных файлах для колонок от DataGridView, который "на замке" и колонки которого "прикручено ручками" ?!! Я выкручивался (если упростить) так: 1) проверяю компонент на "наследственность". Ставлю его на голую форму (обязательно "ставишь модификатор доступа protected..." или public), компилирую, создаю форму-наследник от той и смотрю "замкнут" ли компонент. Еслы не замкнут - можно отложить шаманский бубен до лучших времен. 2) Если компонент "закрыт", то в родительской форме я этот компонент НЕ ставлю на форму вообще но делаю под него поле (свойство) соответствующего типа (например protected DataGridView dgv) в "партиал" определении формы сам, ручками. Далее в нужных методах (например сортировка, поиск по гриду) я использую эту переменную (dgv). А вот в форме-потомке я реально кидаю на форму DataGridView, даю ему имя например DGV, могу с ним делать всё, что душе угодно (колоночки на нужных языках). A в конструкторе формы-наследника дописываю после InitializeComponent(); dgv = DGV; Недостаток такого подхода в том, что длинна такой "наследственности" - ровно одно поколение, если визульный компонент закинут на форму в сыне, для внука уже "замочки"... |
|||
|
||||
werqwrt |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 23.3.2008 Репутация: нет Всего: 1 |
||||
|
||||
Gelis |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 26.10.2006 Где: Брест Репутация: 1 Всего: 4 |
Модератор: Сообщение скрыто. |
|||
|
||||
IApple |
|
||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Для того-же, для чего существует наследование визуальных компонент и вообще наследование. Очень даже логично иметь в приложении окна с единым для всего приложения интерфейсом и функциональностью. У меня например есть потребность в окошке с гридом (возможно привязаном на биндинсорс, который на датасет), тулбаром и контекстным меню на гриде в котором прикручено соответственно кнопочек для поиска, сортировки, фильтрации и т.д. Очень даже логично иметь родительское окно, в котором это все есть и прикручено одно к другому (например поиск из тулбара и из меню с одинаковыми иконками и вызывают один метод), в котором некоторые функции уже реализованы, а некоторые (зависимые от будущего реального наполнения) будут перекрыты. Грубо говоря, справочник Городов, от справочника Улиц или справочника Губерний мало чем отличается, так почему для каждого из них индивидуально проектировать с нуля интерфейс (формы) и следить за одинаковостью?
Когда нет возможности, часто ищутся пути при которых нет необходимости... Я об том и говорю, что прошедшим С++ у которого "никакого дизайнера", дизайнер от VS - уже счастье.
А "второстепенные" задачи не требуют решения? Или в их решении использование наследования становится преступлением?
Так может тогда выбросить эти окошки и вернуться к добрым старым текстовым интерфейсным наработкам?
Юзабилити не менее важная задача, чем все остальное, а возможно и самая главная. Пренебрегать этим можно только в случае, когда не предвидится ни одной программы-конкурента похожего предназначения. |
||||||||||||||
|
|||||||||||||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
Есть user-controls и есть Forms
Для наследования используются классы Form & UserControl соответственно. Можно наследоваться от своей формы так же, как и от класса Form. Аналогичная ситуация с наследованием от собственного контрола. Таким образом вид "наследования форм" существует. Ну а то, что какие-то элементы в классах Form или UserControl являются public, protected, private - это (извините меня) признаки ООП .... и тот, кто не признает право любого класса иметь свои закрытые члены (хотя бы для защиты от ошибок своих же потомков), тот немного ... неправ ![]() Но Вы, IApple, вполне можете наследоваться от любого класса в иерархии UI (от Control или даже от object) и определить все члены класса открытыми. Потом компилируете класс и библиотеку и ссылаетесь на нее в проекте, вместо ссылки на System.Windows.Forms Вот так и решатся все проблемы -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
Gelis |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 26.10.2006 Где: Брест Репутация: 1 Всего: 4 |
Я писал, про наследование форм, что в нем необходимости нет, а то о чем вы говорите это наследование логики (см. MVC или PoEAA Фаулера). Т.е. создаем одну форму, как я уже писал, а наследование делаем в логиках. Т.е. у вас одна форма (представление) и класс логики для этой формы. В случае необходимости создаем класс наследник логики или вешаем несколько логик на одну форму. Можно сделать фабрику логик, которая в зависимости от юзверя создает нужный ему интерфейс. В вашем случае можно еще и UserControl создать.
Я за наследование, но против наследования форм, если вы внимателльно прочитали, то там написано, что нет необходимости в наследовании интерфейса, а есть необходимость в наследовании логики или в применении нескольких логик к одному представлению (форме). Т.е. форма она отвечает только за отображение данных, а уже отображаемые данные поставляются логикой. При такой модели мы можем легко и просто от одного представления перейти к другому (от Windows к Linux аль Web) или создать несколько видов представлений (Win и Web) одних и тех же данных.
Я писал, что работал с Делфи, потом с VS и считаю, что удобство это дело привычки. А в проекте в котором нет никакого дизайнера был создан класс Manager Control - ов, который красивенько выравнивал (сам!!!) контролы на панелях. Еще раз повторюсь что удобство дизайнера дело привычки. Любому перешедшему к Delphi с VS дизайнер Delphi будет казаться неудобным, а из Delphi в VS наоборот.
Я не имел ввиду, что юзабилити не важная задача, но она по моему мнению занимает в 10-ки если не 100-ни раз меньше времени и усилий, чем написание бизнес-логики, поэтому ее легко изменить в случае необходимости. И нафига классный интерфейс с неработающей логикой, что вы клиенту скажете: "Смотрите какой классный интерфейс, но правда все остальное неправильно работает ![]() P.S: Модераторы: Извиняюсь что тема превращается в религиозные войны. |
||||||
|
|||||||
IApple |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Так много сотрясений воздуха...
предложите реальное решение для окна с тулбаром, гридом, к которому прикручено меню (с пунктами, как в тулбаре) поиск и сортировку колонок для двух разных справочников, что б поменьше кода дублировать (который к визуальнойчасти относится).
Её легко изменить в случае неодходимости если использовать наследование. Если у меня в суперсложном по логике приложении имеется 100 похожих простых справочников, то намного легче изменить их вид, если они наследуются от одного предка. Меняеш предка - все синхронно изменились. В противном случае, прийдется лезть в каждый из сотни и добавлять ручками-с. |
|||
|
||||
mlitkin |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 10.7.2007 Репутация: нет Всего: нет |
Спасибо за понимание. Но, почитав ответы на свою тему (и вот здесь тоже: http://sql.ru/forum/actualthread.aspx?bid=...8632&pg=-1), я прихожу к выводу, что видимо для .net-проектов действительно применяется иной (относительно той же делфи) подход к проектированию UI... Возможно, действительно подход с одной формой и наследованием бизнес-логики в большинстве случаев оправдывает себя, т.к. с наследованием форм в делфи тоже есть определенные неудобства. Ну например, если есть 30 форм, наследованных от базовой, то изменив положение какого-то контрола в базовой форме, можно поиметь проблемы с взаимным расположением контролов в дочерних формах. В этом случае бывает необходимо открыть каждую и расставить все по местам... В случае с одной формой и несколькими логиками такой проблемы не будет. |
|||
|
||||
IApple |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Gelis
Прочитал, как применить в моем конкретном случае? Если до банальности упростить условия до таких (уж не взыщите, что у меня так сильно к визуальным компонентам привязано): тулбар на 2 кнопки и менюшка на аналогичных 2 пункта меню (сортировка и поиск) для грида на форме.
Тут совсем не понимаю. Если у меня два однотипных (визуально) справочника Городов и Улиц, то как это стыкуется с тем, что "создаем одну форму" ?
Тоже, очень было бы интересно посмотреть на код. |
||||||
|
|||||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |