C# - Головна Простір імен
► System (5)► Microsoft (1) Для учнів (початківців)
► Відео уроки (4)► Навчання (177) ► Приклади програм (19) ► Секрети Сі Шарп (4) Для професіоналів
► Навчання (6)► Приклади програм (1) |
ІнтерфейсиВ об'єктно-орієнтованому програмуванні іноді потрібно визначити, що клас повинен робити, а не як він буде це робити. Ви вже бачили такий підхід на прикладі абстрактного методу. Абстрактний метод визначає сигнатуру для методу, але не забезпечує його реалізації. У похідному класі кожний абстрактний метод, визначений базовим класом, реалізується по-своєму. Таким чином, абстрактний метод задає інтерфейс для методу, але не спосіб його реалізації. Незважаючи на всю корисність абстрактних класів і методів, що цю ідею можна розвинути. В С# передбачена можливість повністю відокремити інтерфейс класу від його реалізації з допомогою ключового слова interface. Інтерфейси синтаксично подібні абстрактних класів. Проте в інтерфейсі ні один метод не може включати тіло, тобто інтерфейс в принципі не передбачає якої б то не було реалізації. Він визначає, що повинно бути зроблено, але не уточнює, як. Коль скоро інтерфейс визначено, його може реалізувати будь-яку кількість класів. При цьому один клас може реалізувати будь-яке число інтерфейсів. Для реалізації інтерфейсу клас повинен забезпечити тіла (способи реалізації) методів, описаних в інтерфейсі. Кожен клас може визначити власну реалізацію. Таким чином, два класу можуть реалізувати один і той же інтерфейс різними способами, але всі класи підтримують однаковий набір методів. Отже, код, "обізнаний" про наявність інтерфейсу, може використовувати об'єкти будь-якого класу, оскільки інтерфейс для всіх об'єктів однаковий. Надаючи програмістам можливість застосування такого засобу програмування, як інтерфейс, З# дозволяє повною мірою використовувати аспект поліморфізму, який виражається як "один інтерфейс — багато методів". Інтерфейси оголошуються за допомогою ключового слова interface. Ось як виглядає спрощена форма оголошення інтерфейсу: interface ім'я{ тип_возврата имя_метода1(список_параметров) ; тип_возврата имя_метода2(список_параметров); ................ тип__повернення имя_методаN(слисок_параметров); } Ім'я користувача задається елементом ім'я. Методи оголошуються з використанням лише типу повертається значення і сигнатури. Всі ці методи, по суті, — абстрактні. Як згадувалося вище, для методів в інтерфейсі не передбачені способи реалізації. Отже, кожен клас, який включає інтерфейс, повинен реалізувати всі його методи. В інтерфейсі методи неявно є відкритими (public-методами), при цьому не дозволяється явно вказувати спецификатор доступу. Розглянемо приклад інтерфейсу для класу, який генерує ряд чисел, public interface ISeries { int getNextO; // Повертає наступне число ряду, void reset{); // Виконує перезапуск, void setStart(int x); // Встановлює початкову // значення. } Цей інтерфейс має ім'я ISeries. Хоча префікс "І" необов'язковий, багато програмісти його використовують, щоб відрізняти від інтерфейси класів. Інтерфейс ISeries оголошено відкритим, тому він може бути реалізований будь-яким класом в будь-якій програмі. Крім сигнатур методів інтерфейси можуть оголошувати сигнатури властивостей, індексатори і подій. Події розглядаються в главі 15, тому тут ми зупинимося на методах, индексаторах і властивості. Інтерфейси не можуть мати членів даних. Вони не можуть визначати конструктори, деструктори або операторні методи. Крім того, ні один член інтерфейсу не може бути оголошений статичним.
Переглядів: 1963 |