sravani.v
Я могу привести два типа примеров "реального мира" - один из делового мира и другой из истинного "реального мира"."
реальный мир:
У вас есть класс животных. Это абстрактный класс, потому что вы не можете создать экземпляр универсального "животного", но он обеспечивает базовую функциональность.
У вас есть много различных классов животных. У вас есть HomoSapiens, Утконос, Пингвин (который расширяет птицу, другой подкласс животных), жираф, Домашняя муха и т. д. Каждый из них является конкретным классом, который может быть инстанцирован (конечно, есть несколько уровней абстрактных классов между ними и животными (например, Chordata и т. д.)
Теперь ты хочешь заставить что-то летать. Что может летать? Птицы и домашние мухи (среди прочих), поэтому эти классы должны обеспечивать аналогичную функциональность, даже если они широко расположены в нашем дереве наследования. Решение проблемы? Заставьте их использовать интерфейсы. Птица и Домашняя муха не могут одновременно реализовать интерфейс Flyer, поэтому всякий раз, когда мы хотим, чтобы что-то летало, мы можем использовать объект Flyer, не заботясь о том, птица это или Домашняя муха. Аналогично, пингвины и Playtpuses могут реализовать интерфейс Swimmer (и Penguin должен бросить IllegalOperationException в любом из своих методов Flyer, так как пингвины не могут летать).
Что касается бизнес-примеров, то у меня есть механизм персистентности, который будет работать с любым источником данных (XML, ASCII (разделенные и фиксированной длины), различными источниками JDBC (Oracle, SQL, ODBC и т. д.) Я создал базовый абстрактный класс, чтобы обеспечить общую функциональность в этом постоянстве, но создать экземпляр соответствующего "порта" (подкласса) при сохранении моих объектов. (Это значительно облегчает разработку новых "портов", поскольку большая часть работы выполняется в суперклассах, особенно в различных JDBC; поскольку я не только занимаюсь персистентностью, но и другими вещами [например, генерацией таблиц], я должен обеспечить различные различия для каждой базы данных.)
Лучшими бизнес-примерами интерфейсов являются коллекции. Я могу работать с java.util.Список, не заботясь о том, как он реализован; наличие списка в качестве абстрактного класса не имеет смысла, потому что существуют фундаментальные различия в том, как работает ArrayList в отличие от LinkedList. Аналогично, карта и набор. А если я просто работаю с группой объектов и мне все равно, список это, карта или набор, я могу просто использовать интерфейс коллекции.
Надеюсь, что это поможет