3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
|
|||||||
1 | |||||||
Классы и интерфейсы19.09.2024, 23:24. Показов 512. Ответов 22
Метки нет (Все метки)
easybudda, какой бы ты озвучил критерий когда наследоваться от класса, а когда от интерфейса?
Я правда пока только одну свежую книжку про Java прочитал... Но для себя ответа на такой вопрос не нашел. Читал книжки и до этого, из интереса, но тогда интерфейсов еще не было.
0
|
19.09.2024, 23:24 | |
Ответы с готовыми решениями:
22
Интерфейсы, классы. Интерфейсы и абстрактные классы Интерфейсы и абстрактные классы Интерфейсы и абстрактные классы |
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
|
|
20.09.2024, 01:09 | 2 |
Ну я бы не отождествлял классы и интерфейсы. От интерфейсов не наследуются, их реализуют. Правда, появление в интерфейсах методов по умолчанию несколько смазало это утверждение, но в любом случае... Не сочтите за какое-то железо-бетонное правило, но раз уж у меня спросили, для реализации логики программы пишутся интерфейсы. А для реализации методов интерфейсов пишутся классы (а то и вовсе лямбда функции в простых случаях). При этом не принципиально, самостоятельный это класс (технически - наследник от object), или у него предков, как у дурака фантиков. Ну а с наследованием классов логика всегда одна - от общего к частному...
2
|
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
|
|
20.09.2024, 19:24 [ТС] | 3 |
Я пока ошибаюсь в применении некоторых терминов Java...
Ок. Хотя я это не совсем воспринимаю... Как-то попалась вот такая статейка https://habr.com/ru/companies/... es/707762/ И мне больше понравились такие "правила". Х/з насколько я правильно понял тему класс или интерфейс. - Если не нужно изменяемое состояние можно использовать интерфейс - Если нужно изменяемое состояние нужно использовать абстрактный класс Так же класс может реализовывать множество интерфейсов, но наследоваться может только от одного класса. Это так же не мало важный фактор на мой взгляд...
0
|
1053 / 647 / 96
Регистрация: 10.03.2012
Сообщений: 4,337
|
|
20.09.2024, 19:28 | 4 |
0
|
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
|
|
20.09.2024, 19:43 [ТС] | 5 |
easybudda, исходя из моих умозаключений...
Я и смотрю на твой пример. - Для чего там единственный интерфейс? - Все равно делается абстрактный класс, т.к. нужно таки изменяемое состояние. - Выигрыша по количеству символов нет. Т.е. можно запросто обойтись одним абстрактным классом, добавив ему еще абстрактный метод voice() , т.к. метод getName() у него уже есть.Так же мне не понятно почему класс не реализовал метод voice() , согласно интерфейсу?Или абстрактные классы не обязаны выполнять требования интерфейса? Я думал такое обязательно... easybudda, я ничуть не придираюсь, не думай... Просто хотелось бы понять эту тему поподробнее. Вдруг приспичит работать с Java - так хотелось бы поучиться этому у опытных специалистов. Добавлено через 8 минут Какие читал до этого не особо помню... Т.к. между чтениями проходили годы. Последняя книжка это Java. Полное руководство. 12-е изд Но там нет даже описания работы со списками... Т.е. рассказывается про сами основы синтаксиса ЯП. Ну и примеры естественно рассматриваются. Поскольку считаю что четкое понимание "где интерфейс, а где класс" довольно принципиальный вопрос сейчас, а далее он будет еще принципиальнее. Стараюсь побеседовать про это при любом удобном случае. Поскольку работаю на другом ЯП и не всегда бывает время на Java... А тут такой удобный случай! Грех не воспользоваться.
0
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
|
|
20.09.2024, 20:24 | 6 |
А что мешает включать в интерфейс методы, которые должны бы менять внутреннее состояние объектов классов, их реализующих?
Есть такое. Я, правда, не понял, какие у Вас в связи с этим сложности? Беда простеньких примеров в том, что они порой больше вопросов, чем ответов порождают. В общем случае питомец - это не обязательно животное. Кому и кактус с фикусом питомцы, а кому и тамагочи какой-нибудь. И опять же - кактус с фикусом могут быть потомками общего класса Vegitable, а тамагочи может быть вполне себе отдельным классом (не очень знаком с темой, возможно, и там какие-то варианты есть). И, раз уж мы создаём список питомцев, можем смело пихать в него всё, что реализует интерфейс Pet, не зависимо от того, к какому виду (или подвиду) оно принадлежит. Не, не обязаны. Но в подклассе, из которого предполагается создавать объекты, эти методы должны быть хоть как-то реализованы.
0
|
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
|
|
20.09.2024, 20:41 [ТС] | 7 |
Вот эту "возможность" интерфейса я так же понял.
Что "через реализацию" интерфейса можно наладить взаимодействие с абсолютно разными по своей сути классами. Тут только интерфейс. Т.к. класс таки подразумевает родство по своей природе. Т.е. в создаваемом объекте (или экземпляре) должны быть. Правильно я выразился? Все так. Но я начинающий в Java - т.ч. вопросы сейчас для меня весьма полезны, т.к. ответы на них могут многое прояснить. Т.ч. спасибо за участие и ответы. В этом нет никаких сомнений. Напомню что краеугольным камнем для меня только вопрос "класс или интерфейс, что использовать"?
0
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
|
||||||
20.09.2024, 21:55 | 8 | |||||
В классе, объект которого создаётся, должны быть определены все методы. При чём сам класс может быть и анонимным. В примере выше такое тоже работает:
0
|
1053 / 647 / 96
Регистрация: 10.03.2012
Сообщений: 4,337
|
|
21.09.2024, 13:24 | 9 |
0
|
19508 / 11048 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
|
|
23.09.2024, 11:53 | 11 |
Тадам. Интерфейс, может вообще не декларировать методов. Пустой, ага.
Пруфы можно найти в java core например ))
0
|
19508 / 11048 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
|
|
23.09.2024, 12:36 | 13 |
Интерфейс без методов. Пустой. Что тут непонятного?
Добавлено через 5 минут
Сообщение от krvsa
0
|
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
|
|
23.09.2024, 14:19 [ТС] | 14 |
Кроме методов там еще константы можно заводить...
Только какой профит в этом? Разве что вместо наследования от одного класса перейти к списку интерфейсов... iSmokeJC, капец ты какой-то загадочный. Добавлено через 1 минуту iSmokeJC, какое бы ты правило мог бы привести на предмет "когда применить интерфейс, а когда класс"?
0
|
19508 / 11048 / 2931
Регистрация: 21.10.2017
Сообщений: 23,302
|
|
23.09.2024, 14:26 | 15 |
Ну, ежели класс должен "подходить под несколько критериев", а-ля множественное наследование, то абстрактный класс уже не подходит никак. А интерфейсов хоть десяток реализуй.
1
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
|
|
23.09.2024, 18:52 | 17 |
krvsa, влезу с вашего позволения...
Кроме каких-то совсем тривиальных случаев, не имеющих и шанса на развитие, да, так лучше. И снова: интерфейсы и классы это не какие-то тождественные и взаимозаменяемые вещи. Интерфейс можно представить, как некий контракт. Потребитель для реализации своих хотелок выбирает контракт, по которому поставщик обязуется эти хотелки выполнять, и поставщика, под этим контрактом подписавшегося. Про паттерн "Маркер" почитайте. Ну вот представьте: константа Пи используется в геометрии, электрофизике, статистике (и бог знает, где ещё)... При условии, что Вы живёте в мире, где в java нет класса Math, и пишите программу, охватывающую все эти три области сразу, самый простой и очевидный способ "расшарить" эту константу между модулями, в которых она используется - включить её в интерфейс, который "реализуется" везде, где нужна константа Пи, пусть даже кроме неё модули между собой вообще ни что больше не связывает...
1
|
3592 / 1411 / 390
Регистрация: 14.03.2022
Сообщений: 3,345
|
|
23.09.2024, 19:32 [ТС] | 18 |
Про это и в книжках написали... И табличку различий предоставили...
Т.ч. это все тривиальные вещи. А вот чего в учебниках не написали - когда чего применять. Про это и выясняю. До этого ведь жили (а некоторые и все еще живут) без интерфейсов и никто не помер. Обходились классами, без контрактов. Почитал... Что-то дюже глубоко заныривают с этим "маркером"! Х/з понадобится ли такое мне или нет... Добавлено через 7 минут Во! Модули вход пошли. Тут я пока не особо владею знаниями. Интерфейсы можно использовать "между" модулями, а классы уже не получится? Там же вроде как можно делать подключения, как интерфейсов, так и модулей... Т.е. все опять сведется к одиночному наследованию классов против перечня реализованных интерфейсов? Добавлено через 13 минут Не тот термин написал. Читать как как интерфейсов, так и классов...
0
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
|
|
23.09.2024, 19:49 | 19 |
Ну это не столько к терминологии отдельно взятого ЯП, сколько к общим принципам относится. Вычисления, относящиеся к разным областям, лучше в разные модули разносить (не зависимо от того, есть ли в языке слово "module", "package", или там подобное разделение как-то по своему устроено).
Да и классы получится, если не лень каждый раз перед константой имя класса писать... Возможность держать константы в интерфейсах - это не главное их предназначение.
0
|
23.09.2024, 20:16 | 20 |
Вы имеете в виду наследование и реализацию абстрактного класса?
Интерфейс описывает поведение. У него нет состояния. У абстрактного класса есть состояние : он описывает поведение и состояние. Абстрактный класс — это «заготовка» класса: реализовано большинство методов (включая внутренние), кроме нескольких. Из определений, терминологии все становится понятно. Вы упомянули наследование и реализацию. Интерфейс - это своего рода "контракт" в котором прописано, что разработчик обязуется реализовать все методы интерфейса в классе который этот интерфейс реализовывает. public interface Shape extends Cloneable{} - пример интерфейса, который наследует другой интерфейс. Интерфейсы для реализации множественного наследования и расширения функциональности класса. Класс, реализующий интерфейс, должен обеспечить реализацию всех его метода, если только это не абстрактный класс.
0
|
23.09.2024, 20:16 | |
23.09.2024, 20:16 | |
Помогаю со студенческими работами здесь
20
Классы и интерфейсы в Java Абстрактные классы. Интерфейсы Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для классов Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих классов Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих классов Классы и интерфейсы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |