У міру поглиблення у вивченні мови c # все більше задаюся питанням, для чого потрібно це чи то. Так як я самоучка і пишу програму методом тику, в моїх кодах хакер ногу зломить. Але все ж пишу програми. Звичайно, може, я їх пишу неправильно, але кінцевий результат - все працює.
Проблема в тому, що мені нема кого питати, щоб отримати точний адекватну відповідь. У мене немає знайомих програмістів.
заданий 26 Січня '15 о 13:52
@ Геннадій Писарєв я б із задоволенням вам відповів, але відповідь на це питання вимагає досить тривалого пояснення - на жаль пояснювати вам доведеться багато в силу того, що знання ваші досить поверхневі судячи з усього. Написати тут докладне пояснення я на жаль зараз не можу, постараюся зробити це трохи пізніше, коли буде час - DreamChild 26 Січня '15 о 14:23
Невеликий приклад про делегати
Іноді може скластися така ситуація, що ви точно не знаєте ім'я методу, який треба передати в сторонню функцію, але вона повинна бути уніфікована. До того ж делегати можна складати.
Типовий приклад з угрупованнями.
В даному випадку методи виконуються в Main, але практика використання делегатів в тому, що вони передаються в інші функції, які не повинні жорстко кодувати використовуваний метод.
Невеликий приклад про інтерфейси
Інший справу з інтерфейсами, вони потрібні для чіткого опису того, що є в класі. Наприклад, ви робите додаток, яке виконує підключення до БД. Вам треба зробити підключення в трьох типах СУБД за вибором: MySQL, SQL SERVER і Oracle. Ви могли б робити для кожного свій клас і тягати їх, але простіше тягати інтерфейс, не знаючи реалізації класу.
Тепер код, який використовує підключення, може не думати про внутрішню реалізації цих підключень і виконувати їх через інтерфейс.
До того ж варто зауважити, що дуже легко додати нову базу (або абсолютно повністю переписати стару), успадкувавши інтерфейс і не змінюючи весь інший код. Ще тут виконується поліморфізм, ви завжди знаєте, які методи може мати той чи інший клас, дивлячись на його інтерфейс. Це також дозволяє Вам писати свої класи на цьому інтерфейсі. Часто використовуваний приклад - це вбудовані IQueryable і IEnumerable, успадкованих від яких, ваші власні класи можуть реалізувати правильна поведінка "Як масив" для звернень за індексом myClass [1] і "Як перерахування" для foreach (var in myClass).
Ну і оскільки тут піднімалася тема про книги, то ось хороший список:
На додаток, часто використовуються делегати для підписування (і отпісиванія за допомогою операції - =) на події.
Це тільки те, що згадав відразу, там ще є багато ситуацій, де зручні класи і інтерфейси для застосування.
Делегат і правда семантично не сильно відрізняється від посилання на сам клас плюс вказівки, який метод потрібно викликати. В Java делегатів немає, і там доводиться робити саме так.
Однак, як показує практика, такий підхід призводить до досить громіздкою коду.
Аналог на Java / Swing
Справедливості заради, мушу зазначити, що в новій версії Java є такі ж делегати / лямбда-функції, так що синтаксис став схожим.
@DreamChild спасибі. Мене не треба вчити як створювати делегат. Хоч і з цього приводу є питання. Питання полягає в тому, як правильніше робити посилання на клас і викликати метод або робити посилання на делегат. На що це впливає? Може, від безліч посилань на класи це впливає на продуктивність програми або щось інше. Щодо обильности коду, так викликати метод за допомогою посилання на клас, виходить на одну сходинку менше писати доведеться. Знову ж таки повторюся, я не пишу величезні програми, щоб оцінювати перевагу. - Геннадій Писарєв 27 Січня '15 о 5:45
@ Геннадій Писарєв: Я не намагався пояснити вам, як створювати делегат, я намагався показати синтаксичне перевага. І мені здається, там різниця не в одному рядку, а в достатку boilerplate: без делегатів виходить багато коду, який не говорить те, що ви думаєте, а просто потрібен для обв'язки. З приводу семантичних переваг, все складніше. На мій смак, звичайно я повідомляю джерела подій лише дію. яке він повинен ініціювати, тому делегат семантично ближче до того, як я думаю. Якщо ж вам здається, що крім самого дії мають значення і об'єкт, який його виконує. - VladD 27 Січня '15 в 10:02
@ Геннадій Писарєв. то правильніше буде передавати об'єкт. Тобто, форма записи диктується семантикою, а не якимось догматичним правилом, що діє раз і назавжди. Отже, в кожному разі вибирати варто саме вам як архітектору програми. У мене в переважній більшості сам об'єкт не важливий, а важливо лише дію. YMMV. - VladD 27 Січня '15 о 10:05