На даний момент я намагаюся освоїти C #, тому я читаю Адаптивний код за допомогою C # від Gary McLean Hall .
Він пише про візерунки та анти-візерунки. У частині реалізації та інтерфейсів він пише наступне:
У розробників, які не знайомі з концепцією програмування інтерфейсів, часто виникають труднощі відпускати те, що стоїть за інтерфейсом.
Під час компіляції будь-який клієнт інтерфейсу не повинен мати уявлення, яку реалізацію інтерфейсу він використовує. Такі знання можуть призвести до невірних припущень, які підключають клієнта до конкретної реалізації інтерфейсу.
Уявіть загальний приклад, коли класу потрібно зберегти запис у постійному сховищі. Для цього він правильно передає інтерфейс, який приховує деталі застосованого стійкого механізму зберігання. Однак було б неправильно робити припущення щодо того, яка реалізація інтерфейсу використовується під час виконання. Наприклад, передача посилань інтерфейсу на будь-яку реалізацію - це завжди погана ідея.
Це може бути мовний бар'єр або мій брак досвіду, але я не зовсім розумію, що це означає. Ось що я розумію:
У мене є цікавий вільний проект для занять C #. Там у мене клас:
public class SomeClass...
Цей клас використовується в багатьох місцях. Під час навчання C # я прочитав, що краще абстрагуватися інтерфейсом, тому зробив наступне
public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have.
public class SomeClass : ISomeClass <- Same as before. All implementation here.
Тож я ввійшов у всі посилання на клас і замінив їх ISomeClass.
За винятком будівництва, де я писав:
ISomeClass myClass = new SomeClass();
Я правильно розумію, що це неправильно? Якщо так, то чому так, і що мені робити замість цього?
ISomeClass myClass = new SomeClass();
? Якщо ви це справді маєте на увазі, це рекурсія в конструкторі, ймовірно, не те, що ви хочете. Сподіваємось, ви маєте на увазі" побудова ", тобто розподіл, можливо, але не в самому конструкторі, правильно ?
ISomeClass
), але також легко зробити занадто загальні інтерфейси, для яких неможливо написати корисний код, на який момент єдині параметри повинні переосмислити інтерфейс і переписати код або перейти вниз.