Якщо мій клас implements
інтерфейс, то чи можу я сказати, що я слідкую за спадщиною? Я знаю, що коли клас extends
інший клас, то це спадщина.
Якщо мій клас implements
інтерфейс, то чи можу я сказати, що я слідкую за спадщиною? Я знаю, що коли клас extends
інший клас, то це спадщина.
Відповіді:
ОНОВЛЕННЯ: Я переглянув цю відповідь. У коментарях було підкреслено багато хороших моментів, які заслуговують на виклик.
Якщо мій клас реалізує інтерфейс, то чи можу я сказати, що я слідкую за спадщиною?
Не зовсім зрозуміло, що ви маєте на увазі під «слідування спадщиною». Давайте задамо трохи інше запитання?
Що таке спадщина?
Вони тонко різні. Це прикро, тому що це заплутано.
Які плутанини зазвичай виникають із цього тонкого розрізнення?
Плутанина може виникнути через те, що люди думають про спадщину як про механізм обміну деталями реалізації. Хоча це такий механізм, який працює механізм шляхом обміну членів . Ці учасники не повинні мати реалізацій! Як ми побачимо, вони можуть бути абстрактними.
Я особисто був би щасливішим, якби специфікації Java та C # використовували слово, відмінне від "успадкованого", щоб описати взаємозв'язок між методами інтерфейсу та класами, щоб уникнути цієї плутанини. Але вони цього не роблять, і ми маємо міркувати із специфікацій, а не проти них.
Чи є у Java успадковані члени інтерфейсу за класами, які їх реалізують?
Так, деякі є. Дивіться специфікацію Java 8.4.8, яку я цитую тут для вашої зручності.
Клас C успадковує від свого прямого суперкласу та прямих суперінтерфейсів усі абстрактні та типові методи m, для яких справедливі всі наступні дії: [...]
Якщо ви говорите, що клас реалізує інтерфейс, то клас успадковує абстрактні та стандартні методи цього інтерфейсу . (Звичайно, я пропустив умови, які випливають; детальну інформацію див. У специфікації. Зокрема, клас, який реалізує член інтерфейсу, не вважається, що він успадкував цей член. Знову ж, це заплутано? Так.)
Ми зазвичай в Java заявляємо, що клас успадковує інтерфейс?
Зазвичай ми б сказали, що клас реалізує інтерфейс. Як зазначалося вище, клас може успадковувати учасників з інтерфейсу, але все ще не кажуть, що він успадковує інтерфейс. Що заплутано, так.
Чи має значення ця тонка відмінність у щоденній роботі?
Зазвичай ні. Цей вид вузького розбору специфікації є більш корисним для авторів-компіляторів, ніж розробників бізнесу. Його важливіше зрозуміти, коли використовувати інтерфейс, ніж це отримати точне визначення поняття «успадковується від».
java
тому це правильна відповідь, якщо тільки ОП не означало іншого java
:-)
Спадкування означає написання нового підкласу для суперкласу. Написання нового класу проти інтерфейсу реалізує цей інтерфейс. (І написання нового інтерфейсу на основі старого розширює цей інтерфейс.)
Єдиний правильний термін, який стосується всіх трьох можливостей, - це підтипування . Не кожен підтип - це підклас.
З підкласами , ти
За допомогою інтерфейсів ви повністю заповнюєте контракт, застосовуючи заявлені методи.
Ось класичний спосіб на це подивитися. Тепер із Java 8 інтерфейси стають сумішшю:
Чи реалізує інтерфейс, у методах якого всі за замовчуванням реалізація все ще вважається "впроваджувати", а точніше як розширення? Я не міг сказати. Оскільки цей випадок досить надуманий (це фактично ввімкнуло багатонаступництво без громадянства), я все одно використовую "успадкування" лише з підкласами.