Ви повинні вивчити інверсію управління:
У такому сценарії ви б не писали цього:
IInterface classRef = new ObjectWhatever();
Ви б написали щось подібне:
IInterface classRef = container.Resolve<IInterface>();
Це увійде в налаштування на container
об'єкті, засноване на правилах , і побудує для вас фактичний об'єкт, який може бути ObjectWever. Важливим є те, що ви можете замінити це правило на те, що взагалі використовувало інший тип об'єкта, і ваш код все одно буде працювати.
Якщо ми залишимо IoC поза столом, ви можете написати код, який знає, що він може говорити з об’єктом, який робить щось конкретне , але не тим, який тип об'єкта чи як це робить.
Це стане в нагоді при передачі параметрів.
Що стосується вашого круглих питань "Крім того, як ви могли написати метод, який використовує об'єкт, що реалізує інтерфейс? Це можливо?", В C # ви просто використовуєте тип інтерфейсу для типу параметра, наприклад:
public void DoSomethingToAnObject(IInterface whatever) { ... }
Це підключається прямо до "розмови з об'єктом, який робить щось конкретне". Метод, визначений вище, знає, чого очікувати від об'єкта, що він реалізує все в IInterface, але йому не важливо, який тип об'єкта це, лише те, що він дотримується контракту, що таке інтерфейс.
Наприклад, ви, мабуть, знайомі з калькуляторами і, ймовірно, використовували досить багато своїх днів, але більшість часу вони всі різні. Ви, з іншого боку, знаєте, як повинен працювати стандартний калькулятор, тому ви можете використовувати їх усі, навіть якщо ви не можете використовувати конкретні функції, які має кожен калькулятор, який не має жоден інший.
Це краса інтерфейсів. Ви можете написати фрагмент коду, який знає, що він передасть йому об'єкти, від яких можна очікувати певної поведінки. Це не байдуже, що це за предмет, лише те, що він підтримує необхідну поведінку.
Дозвольте навести конкретний приклад.
У нас є спеціально створена система перекладу для форм Windows. Ця система проходить цикл через елементи управління на формі та перекладає текст у кожну. Система знає, як керувати базовими елементами управління, як-от властивість type-of-control-that-has-a-Text та подібні базові речі, але для чого-небудь базового це не вистачає.
Тепер, оскільки елементи управління успадковують попередньо визначені класи, над якими ми не маємо контролю, ми могли б зробити одну з трьох речей:
- Створіть підтримку нашої системи перекладу, щоб виявити конкретно, з яким типом управління вона працює, і перекладати правильні біти (кошмар технічного обслуговування)
- Побудувати підтримку в базові класи (неможливо, оскільки всі елементи управління успадковуються від різних попередньо визначених класів)
- Додати підтримку інтерфейсу
Отже, ми зробили nr. 3. Усі наші елементи управління реалізують ILocalizable, що є інтерфейсом, який дає нам один метод, можливість перекладати "себе" в контейнер тексту / правил перекладу. Таким чином, формі не потрібно знати, який тип керування він знайшов, лише те, що він реалізує певний інтерфейс, і знає, що існує метод, за допомогою якого він може викликати локалізацію управління.