Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Зачем нужен интерфейс? [дубликат]

#java #ооп


        
             
                
                    
                        
                            This question already has answers here:
                            
                        
                    
                
                        
                            Отличия абстрактного класса от интерфейса (abstract class
and interface)
                                
                                    (12 ответов)
                                
                        
                                Closed 3 года назад.
            
                    
Зачем в java интерфейс, если есть абстрактные классы? Кроме множественного наследования,
в чем главные различия?
    


Ответы

Ответ 1



Разница в концепции. Абстрактные классы помогают создавать иерархию с общими чертами. Важным тут является именно связь родитель — наследник. Например абстрактный класс «птица», ее наследники — конкретные виды птиц. При использовании нам не важно, какая именно птица будет — мы используем ссылку с типом абстрактного класса. И используем методы «кричать», «ходить», «летать». Все ок, но что если не все птицы умеют летать? Например страус, пингвин. Здесь нам могут помочь интерфейсы, которым не важна связь родитель — наследник, они задают правила поведения. Мы можем выделить метод «летать» в интерфейс и реализовать его у тех птиц, которые могут летать; при этом каждая птица может летать характерным только для нее способом. Так же мы сможем в будущем реализовать этот интерфейс у самолета и определить его способ полета. Например, у нас на острове группа зверей, птиц, машин и нам надо переправить их на другой остров. В этом случае это сделают те, кто реализует интерфейс с методом «летать». И здесь мы получаем две ветви полиморфизма, одна задает связь родитель —наследник, вторая — поведение.

Ответ 2



Допустим, есть три экземпляра классов лошадь, машина, лодка. Все они могут реализовывать интерфейс "перевозка людей". И не важно, каким способом каждый из объектов это делает. Главное, что обязан делать. Когда надо "перевезти людей", по интерфейсу мы можем обратиться к тем объектам, которые его могут реализовать. Кроме того, интерфейсная ссылка, указывая на экземпляр класса, сохраняет его от сборки мусора, когда ссылок на него не осталось.

Ответ 3



Реализации модульности, слабой связанность. Отличие от абстрактного класса - в JVM нет множественного наследования и конкретный класс может наследовать только от одного абстрактного. А вот implement интерфейсов - может, сколько угодно.

Ответ 4



Насколько я знаю, интерфейсы в java могут содержать только абстрактные методы и никакой реализации. В них нет конструкторов. В абстрактном классе может быть 1 или больше абстрактных методов, и также он может иметь методы с реализацией. В АК есть конструктор. Класс может наследовать много интерфейсов, но только один класс. Пишу на Scala, там используются трейты вместо интерфейсов. Вышесказанное относится и к трейтам тоже, но там еще можно прокинуть type class в него, и плюс в нем могут быть абстрактные и реализованные методы.

Комментариев нет:

Отправить комментарий