Інтерфейси в ООП (java), по-простому

Загальне визначення: Інтерфейс це сукупність методів і правил взаємодії елементів системи. Іншими словами інтерфейс визначає як елементи будуть взаємодіяти між собою.

Коли ви використовуєте ці "об'єкти" ви впевнені в тому що ви зможете використовувати їх так само. Завдяки тому що ви знайомі з їх інтерфейсом

У програмуванні щось схоже. Чому графічну частину програми часто називають інтерфейсом? Тому, що вона визначає яким чином ви зможете використовувати основний функціонал закладений в програмі.

"Інтерфейс визначає яким чином ми можемо використовувати об'єкт" - перенесемо цю думку в площину програмування.

Припустимо у вас в програмі є такі типи:

а зараз подивимося як можна користуватися тим що у нас є:

Як бачите використовуємо ми їх однаково, але суть криється в реалізації методів:

З одного боку той факт, що SomeCar успадковує інтерфейс CarWithKpp (а за допомогою останнього ще й Car), дозволяємо нам використовувати його для роботи з методами testAction1, testAction2. Інтерфейси які реалізовані (імплементовані) в класі SomeCar - надають доступ до правильного його використання. А ще використання інтерфейсу в сигнатурі методу гарантує, що ви отримаєте саме той тип, який вам потрібен.

Зворотний бік медалі полягає в тому, що інтерфейс накладає обмеження на використання класу. Прикладом цього є те, що в методі testAction2 отримати доступ до методу getKpp вже неможливо. Таким чином можна приховати методи і властивості які оголошені в інтерфейсі CarWithKpp, а так само методи оголошені в класі SomeCar (якщо їх немає в інтерфейсі). Обидва методи можуть використовувати тільки той набір "коштів", які їм доступні (це визначається інтерфейсом).

По простому говорите? Ну ок, правда зараз тут почнуть плюватися всякі товариші нібито гуру :)

Інтерфейс - це можливість поглянути на клас як на об'єкт трохи іншого типу.

Поясню: ну як би назва говорить за це. Об'єкт в ООП це якась сутність має свій набір методів і роботи з ним - методи назвемо умовно "воротами", а інтерфейс це "двері" в цих "воротах" - трошки інший спосіб поводження з тим же самим об'єктом. Так що якщо забути про "ворота" то це здається іншим об'єктом. Ключове слово тут здається.

Приклад: є об'єкт стіл, у якого є методи роботи з ним: як то є поїсти сидячи за ним, накрити на ньому хавчик, поставити, зібрати, відпиляти ніжки та ін. Але цей же об'єкт стіл можна розглядати як інтерфейс меблі (на мові ООП це називається клас типу стіл реалізує інтерфейс типу меблі: class Table implements Furniture. Зрозуміло, що не на кожній меблів можна поїсти або відпиляти ніжку, але що вже точно так це те що меблі можна поставити і зібрати.

Тепер для чого все це потрібно. Знову ж приклад з меблями - якщо скажемо тобто об'єкт стілець, який також реалізує інтерфейс меблі, то і зі стільцем і зі столом можна звертатися однаково - в цьому і полягає сенс інтерфейсу - в уніфікації роботи з різнотипними об'єктами.

P.S. До речі, улюблений питання інтерв'юерів на співбесіді: що має більш високий рівень абстракції - клас, абстрактний клас або інтерфейс? Правильна відповідь - інтерфейс

Розуміння інтерфейсів прийде з часом. Хоч скільки читай, скільки не пояснює, Ви Самі повинні зрозуміти ту гнучкість, той масштаб дій, які вони надають програмісту. Намагайтеся їх використовувати. Бібліотека класів Java надає інтерфейси для реалізації. Спробуйте їх вивчити, можливо це допоможе Вам вловити всю міць яку надає програмування з використанням інтерфейсів.

Інтерфейсом ** об'єкта ми назвемо набір операцій (методів), які він може здійснювати або які можна здійснювати над ним. Наприклад, інтерфейс числа 3 називається, власне, «Число» і включає в себе набір операцій додавання, віднімання, множення і ділення. Реалізувати цей інтерфейс може скільки завгодно типів / класів, наприклад, типи ЦелоеЧісло, ВещественноеЧісло, КомплексноеЧісло, а також такі неочевидні типи як Інтервал або Полином. У той же час, один і той же тип може реалізувати більш ніж один інтерфейс. Так, ЦелоеЧісло крім інтерфейсу Число може реалізувати інтерфейс Перечіслімий - для цього в класі ЦелоеЧісло буде необхідно всього лише доопределить операції «наступний» і «попередній».

Вам може здатися дивним, але це саме те, що відрізняє людину від тварини - використання інтерфейсів замість класів. Ви, напевно, пам'ятаєте класичний досвід з мавпою, яку привчили гасити вогонь водою з відерця; а потім поставили відерце на пліт посеред басейну, але мавпа все одно бігала по містку на пліт і черпала воду з відерця, замість того, щоб черпати воду прямо з басейну. Тобто мавпочка використовувала клас Вода в-відерце замість інтерфейсу Вода (і навіть більше, скажу по секрету: замість інтерфейсу Засіб-для-Гасіння).

Коли ми мислимо класами - уподібнюємося тваринам. Люди мислять (і програмують) інтерфейсами.

По-простому. Питання з множинним спадкуванням в багатьох мовах програмування вирішується просто - або дозволити, або заборонити. Джавісти вирішили сісти на обидва стільця і ​​вибрали свій, особливий шлях. Джава, в принципі, не вміє в множинне спадкування класів. Якщо ми пишемо ключове слово extends. то ми знаємо, що успадковувати ми будемо тільки один клас, будь він абстрактним або звичайним. Але щоб спростити проектування і забезпечення сумісності, плюшки від множинного спадкоємства теж хочеться мати, і тут на сцені з'являються інтерфейси. Інтерфейс - це список методів (тільки public (навіть слово це писати не треба, в інтерфейсі інших бути не може), і тільки БЕЗ реалізації) і змінних, які обов'язково, ну ось з будь-якого є в класі-нащадку. І ось інтерфейсів якраз через ключове слово implements можна пхати скільки завгодно. І один від одного їх наслідувати можна. Таким чином, інтерфейс - це гарантія того, що класи, що реалізують його, містять методи і змінні, в ньому перераховані. Тому, вираз ourObject instanseof ourInterface повертає істину, ми точно знаємо, що в ourObject є методи, перераховані в ourInterface

Інтерфейси є основою взаємодії всіх сучасних інформаційних систем. Якщо інтерфейс будь-якого об'єкта (персонального комп'ютера, програми, функції) не змінюється (стабільний, стандартизований), це дає можливість модифікувати сам об'єкт, який не перебудовуючи принципи його взаємодії з іншими об'єктами (так, наприклад, навчившись працювати з однією програмою під Windows, користувач з легкістю освоїть і інші - тому, що вони мають однотипні елементи інтерфейсу).

Приклад з програмами Windows дуже зрозумілий)) я сам сюди зайшов щоб зрозуміти що таке інтерфейс

Інтерфейс в java визначає інтерфейс класу. Незрозуміло стає через недосконалості технічного російського в програмуванні. Для більш загального розуміння потрібно усвідомити значення слова інтерфейс.

Інтерфейси призначені для підтримки динамічного дозволити дзвінки методів під час виконання. Як правило, для нормального виконання виклику методу з одного класу в іншому обидва класи мають бути присутні під час компіляції, щоб компілятор Java міг перевірити сумісність сигнатур методів. Само по собі це вимога створює статичну і не розширюється середу розподілу класів. У такій системі функціональні можливості неминуче передаються вгору по ієрархії класів, в результаті чого механізми будуть ставати доступними все більшій кількості підкласів. Інтерфейси призначені для запобігання цієї проблеми. Вони ізолюють визначення методу або набору методів від ієрархії успадкування. А оскільки ієрархія інтерфейсів не збігається з ієрархією класів, то класи, ніяк не пов'язані між собою ієрархічно. можуть реалізувати один і той же інтерфейс. Саме в цьому можливості інтерфейсів виявляються найбільш повно.

Схожі статті