Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 4872-й день

 C# для новичков, вопросы и ответы

Tyomniy
May 3 2008, 13:06
  
Пост #1



Репутация:   5  
Дух


Группа: Пользователи
Сообщений: 24
С нами с: 3-June 07


Тут я предлагаю все новичкам программирования на C# выкладывать свои вопросы. По возможности, я думаю, все кто в этом что-то шарит будут стараться отвечать !

Тема для обговорення мови програмування C#, всі сторонні коментарі будуть видалятися, а їх автори отримувати %

Сообщение отредактировал BoyKot - Jun 11 2008, 20:40
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
14 Страницы  « < 12 13 14  
Reply to this topicStart new topic
Ответов(260 - 273)
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
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
грик
Aug 13 2015, 13:31
  
Пост #262



Репутация:   2  
Активист
*

Группа: Пользователи
Сообщений: 267
С нами с: 20-October 13


(Carnifex @ Aug 13 2015, 14:12) Перейти к цитате

Вы нашли в базовых библиотеках два идентичных интерфейса с разными названиями?

Нет, я имел ввиду, что существуют два интерфейса из библиотек .NET, у которых абсолютно одинаковые по сигнатуре методы (один, два, но не все). И без этой техники невозможно реализовать разное поведение для каждого из методов.
(Carnifex @ Aug 13 2015, 14:12) Перейти к цитате

Чтоб понять в чем тут вопрос, унаследуйте Ваш класс только от одного интерфейса

Не понял. Я хочу, чтобы класс реализовывал именно 2 интерфейса. С одним и так понятно.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Phaust
Aug 13 2015, 14:04
  
Пост #263



Репутация:   1174  
сам себе авторитет
******

Группа: Пользователи
Сообщений: 14 105
С нами с: 9-July 07


(грик @ Aug 12 2015, 11:49) Перейти к цитате

Нет, это вот так:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

В чем смысл такого ограничения?

Это синтаксис бро, так в стандарте написано. http://www.ecma-international.org/publicat...ST/Ecma-334.pdf
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
грик
Aug 13 2015, 14:09
  
Пост #264



Репутация:   2  
Активист
*

Группа: Пользователи
Сообщений: 267
С нами с: 20-October 13


(Phaust @ Aug 13 2015, 15:04) Перейти к цитате

Это синтаксис бро, так в стандарте написано. http://www.ecma-international.org/publicat...ST/Ecma-334.pdf

Т.е. нужно смириться и приводить к интерфейсу?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Phaust
Aug 13 2015, 14:29
  
Пост #265



Репутация:   1174  
сам себе авторитет
******

Группа: Пользователи
Сообщений: 14 105
С нами с: 9-July 07


(грик @ Aug 13 2015, 14:09) Перейти к цитате

Т.е. нужно смириться и приводить к интерфейсу?

Нет, нужно не создавать таких интерфейсов с такими именами методов. Это говнокод в чистом виде. Если уж вдруг так случилось, что эти интерфейсы не твои и ты вынужден их реализовывать ты всегда можешь сделать свою обертку надо одним из них

Сообщение отредактировал Phaust - Aug 13 2015, 14:30
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
грик
Aug 13 2015, 14:52
  
Пост #266



Репутация:   2  
Активист
*

Группа: Пользователи
Сообщений: 267
С нами с: 20-October 13


(Phaust @ Aug 13 2015, 15:29) Перейти к цитате

обертку надо одним из них

Как?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
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
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
грик
Aug 13 2015, 16:02
  
Пост #268



Репутация:   2  
Активист
*

Группа: Пользователи
Сообщений: 267
С нами с: 20-October 13


(Carnifex @ Aug 13 2015, 16:13) Перейти к цитате
И подобные вещи, как верно сказал Фауст, нужно не допускать, а не холить и лелеять такой подход ища выход из подобных ситуаций.

Мне самому не понравилось, в Троелсене был такой пример, потому я и спросить решил.
(Carnifex @ Aug 13 2015, 16:13) Перейти к цитате
На счет обертки - ну, я бы сделал так (в студии не проверял).
ISmth1 ismth1 = this as ISmth1;
ISmth2 ismth2 = this as ISmth2;

ismth1.Do();
ismth2.Do();

Работает, но это тоже приведение к типу интерфейса, более громоздкое. Не думаю, что под оберткой имелось ввиду это.

Сообщение отредактировал грик - Aug 13 2015, 16:06
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Carnifex
Aug 13 2015, 17:51
  
Пост #269



Репутация:   16  
Дух


Группа: Пользователи
Сообщений: 179
С нами с: 5-July 09


Это и не обертка была, просто спецификация методов.
Можно сделать очередное извращение.
public interface ISmth2 : ISmth1
{
Do(); -Этот метод скроет такой же метод родительского интерфейса. А если бы в родительском были другие методы, класс - consumer должен был бы реализовать и методы ISmth1
}

Потом просто унаследовать класс от ISmth2
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Phaust
Aug 13 2015, 19:19
  
Пост #270



Репутация:   1174  
сам себе авторитет
******

Группа: Пользователи
Сообщений: 14 105
С нами с: 9-July 07


(грик @ Aug 13 2015, 14:52) Перейти к цитате

Как?

Что то типа

void Exectute()
            {
                (this as ISmth2).Do();
            }

если ISmth2.Do() используется в коде класса(!). Хотя тоже, как бы попахивает... Самый правильный подход избегать такого нейминга. Если не удалось-"жизнь это боль и страдания".
Тем не менее, за всю свою практику с подобной необходимостью не сталкивался, что наталкивает меня на мысль что если она у вас возникла-вы что-то делаете не так.

Сообщение отредактировал Phaust - Aug 13 2015, 19:35
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
грик
Aug 14 2015, 11:55
  
Пост #271



Репутация:   2  
Активист
*

Группа: Пользователи
Сообщений: 267
С нами с: 20-October 13


(Carnifex @ Aug 13 2015, 18:51) Перейти к цитате
public interface ISmth2 : ISmth1
{
Do(); -Этот метод скроет такой же метод родительского интерфейса. А если бы в родительском были другие методы, класс - consumer должен был бы реализовать и методы ISmth1
}

Потом просто унаследовать класс от ISmth2

Это не подходит, потому реализация методов из разных интерфейсов должна быть разной. Чтобы реализация была одинаковой не обязательно так делать, можно просто не делать явной реализации интерфейса, а просто реализовать один метод в классе под названием Do().
(Phaust @ Aug 13 2015, 20:19) Перейти к цитате
Что то типа

Понял, спасибо.

Сообщение отредактировал грик - Aug 14 2015, 11:58
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Carnifex
Aug 14 2015, 12:21
  
Пост #272



Репутация:   16  
Дух


Группа: Пользователи
Сообщений: 179
С нами с: 5-July 09


Это не подходит, потому реализация методов из разных интерфейсов должна быть разной. Чтобы реализация была одинаковой не обязательно так делать, можно просто не делать явной реализации интерфейса, а просто реализовать один метод в классе под названием Do().

You've got it! )) Конечно это все не подходит! Ровно как и не подходит изначальная задача ни к одному из принципов и паттернов проектирования. Но если мы имеем извращение изначально. Да, к тому же, извращение которое менять нельзя (начальные условия задачи же) - почему бы не извратиться самому gy.gif

Сообщение отредактировал Carnifex - Aug 14 2015, 12:22
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Corey656
Feb 3 2017, 0:14
  
Пост #273



Репутация:   1  
Дух


Группа: Пользователи
Сообщений: 20
С нами с: 8-November 11


Тема мертва? sad.gif

Видеокурс C# 5.0. От простого к сложному - начал проходить его, очень нравится подача. Что можете посоветовтать ещё почитать, так сказать для закрепления?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
KOCMOHABT
Apr 18 2019, 8:04
  
Пост #274



Репутация:   219  
Постоялец
***

Группа: Пользователи
Сообщений: 1 835
С нами с: 29-June 16


(Corey656 @ Feb 3 2017, 1:14) Перейти к цитате

Тема мертва? sad1.png

Видеокурс C# 5.0. От простого к сложному - начал проходить его, очень нравится подача. Что можете посоветовтать ещё почитать, так сказать для закрепления?

CLR via C#
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

14 Страницы  « < 12 13 14
Reply to this topicStart new topic

 



- Упрощённая версия
Сейчас: 18th July 2019 - 6:45
Сайт не предоставляет электронные версии произведений, а занимается лишь коллекционированием и каталогизацией ссылок, присылаемых и публикуемых на форуме нашими читателями. Если вы являетесь правообладателем какого-либо представленного материала и не желаете чтобы ссылка на него находилась в нашем каталоге, свяжитесь с нами и мы удалим её. Файлы для обмена предоставлены пользователями сайта.