C# для новичков, вопросы и ответы |
Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 6830-й день
Шановні користувачі! Запрошуємо вас до офіційного телеграм-канала 0day Community. Тут ви зможете поспілкуватися одне з одним та дізнатися про останні новини щодо роботи ресурса, поставити запитання до адміністрації, тощо. Перейти до телеграм-канала можна відсканувавши QR-код або натиснувши на посилання: @zeroday_ua |
C# для новичков, вопросы и ответы |
Tyomniy |
May 3 2008, 13:06
Пост
#1
|
Репутация: 5 Дух Группа: Пользователи Сообщений: 24 С нами с: 3-June 07 |
Тут я предлагаю все новичкам программирования на C# выкладывать свои вопросы. По возможности, я думаю, все кто в этом что-то шарит будут стараться отвечать !
Тема для обговорення мови програмування C#, всі сторонні коментарі будуть видалятися, а їх автори отримувати % Сообщение отредактировал BoyKot - Jun 11 2008, 20:40 |
Carnifex |
Aug 13 2015, 13:12
Пост
#261
|
Репутация: 16 Дух Группа: Пользователи Сообщений: 179 С нами с: 5-July 09 |
В базовых библиотеках .NET есть интерфейсы, в которых одинаковые названия методов. Да и пример, когда это логично, можно придумать. Вы нашли в базовых библиотеках два идентичных интерфейса с разными названиями? 2) ISmth2.Do(); А... Ну так да. Туплю. Чтоб понять в чем тут вопрос, унаследуйте Ваш класс только от одного интерфейса, удалите реализацию методов в класе и снова нажмите правую клавишу и Implement interface (Вы же этим пользовались?). Далее, в методе Foo напишите: Do(); ISmth1.Do(); ( или если унаследовали от второго ISmth2.Do(); ) И поймете в чем проблема. Сообщение отредактировал Carnifex - Aug 13 2015, 13:22 |
грик |
Aug 13 2015, 13:31
Пост
#262
|
Репутация: 2 Активист Группа: Пользователи Сообщений: 267 С нами с: 20-October 13 |
Вы нашли в базовых библиотеках два идентичных интерфейса с разными названиями? Нет, я имел ввиду, что существуют два интерфейса из библиотек .NET, у которых абсолютно одинаковые по сигнатуре методы (один, два, но не все). И без этой техники невозможно реализовать разное поведение для каждого из методов. Чтоб понять в чем тут вопрос, унаследуйте Ваш класс только от одного интерфейса Не понял. Я хочу, чтобы класс реализовывал именно 2 интерфейса. С одним и так понятно. |
Phaust |
Aug 13 2015, 14:04
Пост
#263
|
Репутация: 1176 сам себе авторитет Группа: Пользователи Сообщений: 14 117 С нами с: 9-July 07 |
Нет, это вот так: » Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... « В чем смысл такого ограничения? Это синтаксис бро, так в стандарте написано. http://www.ecma-international.org/publicat...ST/Ecma-334.pdf |
грик |
Aug 13 2015, 14:09
Пост
#264
|
Репутация: 2 Активист Группа: Пользователи Сообщений: 267 С нами с: 20-October 13 |
Это синтаксис бро, так в стандарте написано. http://www.ecma-international.org/publicat...ST/Ecma-334.pdf Т.е. нужно смириться и приводить к интерфейсу? |
Phaust |
Aug 13 2015, 14:29
Пост
#265
|
Репутация: 1176 сам себе авторитет Группа: Пользователи Сообщений: 14 117 С нами с: 9-July 07 |
Т.е. нужно смириться и приводить к интерфейсу? Нет, нужно не создавать таких интерфейсов с такими именами методов. Это говнокод в чистом виде. Если уж вдруг так случилось, что эти интерфейсы не твои и ты вынужден их реализовывать ты всегда можешь сделать свою обертку надо одним из них Сообщение отредактировал Phaust - Aug 13 2015, 14:30 |
грик |
Aug 13 2015, 14:52
Пост
#266
|
Репутация: 2 Активист Группа: Пользователи Сообщений: 267 С нами с: 20-October 13 |
|
Carnifex |
Aug 13 2015, 15:13
Пост
#267
|
Репутация: 16 Дух Группа: Пользователи Сообщений: 179 С нами с: 5-July 09 |
Не понял. Я хочу, чтобы класс реализовывал именно 2 интерфейса. С одним и так понятно. 2) ISmth2.Do(); - эта запись пытается вытянуть метод из интерфейса. Компилятор не воспринимает это как указание абсолютного имени метода внутри класса. И подобные вещи, как верно сказал Фауст, нужно не допускать, а не холить и лелеять такой подход ища выход из подобных ситуаций. На счет обертки - ну, я бы сделал так (в студии не проверял). ISmth1 ismth1 = this as ISmth1; ISmth2 ismth2 = this as ISmth2; ismth1.Do(); ismth2.Do(); Правда, я такого еще ни разу не писал)) Сообщение отредактировал Carnifex - Aug 13 2015, 15:22 |
грик |
Aug 13 2015, 16:02
Пост
#268
|
Репутация: 2 Активист Группа: Пользователи Сообщений: 267 С нами с: 20-October 13 |
И подобные вещи, как верно сказал Фауст, нужно не допускать, а не холить и лелеять такой подход ища выход из подобных ситуаций. Мне самому не понравилось, в Троелсене был такой пример, потому я и спросить решил. На счет обертки - ну, я бы сделал так (в студии не проверял). ISmth1 ismth1 = this as ISmth1; ISmth2 ismth2 = this as ISmth2; ismth1.Do(); ismth2.Do(); Работает, но это тоже приведение к типу интерфейса, более громоздкое. Не думаю, что под оберткой имелось ввиду это. Сообщение отредактировал грик - Aug 13 2015, 16:06 |
Carnifex |
Aug 13 2015, 17:51
Пост
#269
|
Репутация: 16 Дух Группа: Пользователи Сообщений: 179 С нами с: 5-July 09 |
Это и не обертка была, просто спецификация методов.
Можно сделать очередное извращение. public interface ISmth2 : ISmth1 { Do(); -Этот метод скроет такой же метод родительского интерфейса. А если бы в родительском были другие методы, класс - consumer должен был бы реализовать и методы ISmth1 } Потом просто унаследовать класс от ISmth2 |
Phaust |
Aug 13 2015, 19:19
Пост
#270
|
Репутация: 1176 сам себе авторитет Группа: Пользователи Сообщений: 14 117 С нами с: 9-July 07 |
Как? Что то типа void Exectute() { (this as ISmth2).Do(); } если ISmth2.Do() используется в коде класса(!). Хотя тоже, как бы попахивает... Самый правильный подход избегать такого нейминга. Если не удалось-"жизнь это боль и страдания". Тем не менее, за всю свою практику с подобной необходимостью не сталкивался, что наталкивает меня на мысль что если она у вас возникла-вы что-то делаете не так. Сообщение отредактировал Phaust - Aug 13 2015, 19:35 |
грик |
Aug 14 2015, 11:55
Пост
#271
|
Репутация: 2 Активист Группа: Пользователи Сообщений: 267 С нами с: 20-October 13 |
public interface ISmth2 : ISmth1 { Do(); -Этот метод скроет такой же метод родительского интерфейса. А если бы в родительском были другие методы, класс - consumer должен был бы реализовать и методы ISmth1 } Потом просто унаследовать класс от ISmth2 Это не подходит, потому реализация методов из разных интерфейсов должна быть разной. Чтобы реализация была одинаковой не обязательно так делать, можно просто не делать явной реализации интерфейса, а просто реализовать один метод в классе под названием Do(). Что то типа Понял, спасибо. Сообщение отредактировал грик - Aug 14 2015, 11:58 |
Carnifex |
Aug 14 2015, 12:21
Пост
#272
|
Репутация: 16 Дух Группа: Пользователи Сообщений: 179 С нами с: 5-July 09 |
Это не подходит, потому реализация методов из разных интерфейсов должна быть разной. Чтобы реализация была одинаковой не обязательно так делать, можно просто не делать явной реализации интерфейса, а просто реализовать один метод в классе под названием Do(). You've got it! )) Конечно это все не подходит! Ровно как и не подходит изначальная задача ни к одному из принципов и паттернов проектирования. Но если мы имеем извращение изначально. Да, к тому же, извращение которое менять нельзя (начальные условия задачи же) - почему бы не извратиться самому Сообщение отредактировал Carnifex - Aug 14 2015, 12:22 |
Corey656 |
Feb 3 2017, 0:14
Пост
#273
|
Репутация: 1 Дух Группа: Пользователи Сообщений: 20 С нами с: 8-November 11 |
Тема мертва?
Видеокурс C# 5.0. От простого к сложному - начал проходить его, очень нравится подача. Что можете посоветовтать ещё почитать, так сказать для закрепления? |
KOCMOHABT |
Apr 18 2019, 8:04
Пост
#274
|
Репутация: 269 Постоялец Группа: Пользователи Сообщений: 1 932 С нами с: 29-June 16 |
|
vitallydion |
Mar 31 2020, 19:51
Пост
#275
|
Репутация: 8 Дух Группа: Пользователи Сообщений: 167 С нами с: 12-May 11 |
Уважаемые софорумцы, решил почитать Шидлта С# 4.0.
Читаю одну главу ну никак не могу вехать о чем идет речь, помогите направить мысль в нужное русло. Дело несколько усложняется при передаче методу ссылки на объект. В этом случае сама ссылка по-прежнему передается по значению. Следовательно, создается копия ссылки, а изменения, вносимые в параметр, не оказывают никакого влияния на аргумент. (Так, если организовать ссылку параметра на новый объект, то это изменение не повлечет за собой никаких последствий для объекта, на который ссылается аргумент.) не понимай Но главное отличие вызова по ссылке заключается в том, что изменения, происходящие с объектом, на который ссылается параметр, окажут влияние на тот объект, на который ссылается аргумент. Попытаемся выяснить причины подобного влияния. Напомним, что при создании переменной типа класса формируется только ссылка на объект. Поэтому при передаче этой ссылки методу принимающий ее параметр будет ссылаться на тот же самый объект, на который ссылается аргумент. Это означает, что и аргумент, и параметр ссылаются на один и тот же объект и что объекты, по существу, передаются методам по ссылке. Таким образом, объект в методе будет оказывать влияние на объект, используемый в качестве аргумента. В первой части не изменяется во второй части изменяется, растолкуйте плиз. Вторая часть понятная но первая противоречит второй. Сообщение отредактировал vitallydion - Mar 31 2020, 20:41 |
Упрощённая версия | Сейчас: 25th November 2024 - 22:07 |
Сайт не розміщує електронні версії творів, а займається лише колекціонуванням та каталогізацією посилань, що публікуються нашими користувачами. Якщо Ви є правовласником якоїсь частини опублікованого матеріалу та не бажаєте, щоб посилання на нього знаходилось в нашому каталозі, зв’яжіться з нами і ми видалимо його. Файли для обміну надані користувачами сайту і адміністрація не несе відповідальності за їх вміст. |