Перечислите основные принципы ООП
Что проверяют
Знаете ли вы четыре принципа и понимаете ли, как они выражены в Kotlin.
Как отвечать
Инкапсуляция: объединение данных и работающего с ними поведения плюс сокрытие внутреннего устройства. Смысл не в приватных полях как таковых, а в защите инварианта: класс сам следит за корректностью своего состояния. В Kotlin для этого есть модификаторы видимости и очень удобный приём с сужением видимости установщика значения, когда снаружи свойство читается, а изменяется только изнутри.
Наследование: получение поведения родителя. Здесь стоит отметить особенность Kotlin: классы и методы закрыты для наследования по умолчанию, и открыть их надо явно. Это осознанное решение языка, потому что класс, не спроектированный под наследование, легко сломать переопределением.
Полиморфизм: работа с разными типами через общий интерфейс. Делится на два вида: переопределение методов и параметризация обобщениями.
Абстракция: выделение существенного и сокрытие деталей. Выражается интерфейсами и абстрактными классами.
Что стоит добавить, чтобы ответ не выглядел заученным:
- наследование это самый проблемный принцип. Оно жёстко связывает наследника с реализацией родителя, а правка базового класса ломает потомков неожиданным образом. Отсюда общее правило предпочитать композицию;
- в Kotlin для замкнутых иерархий есть запечатанные типы: набор наследников известен компилятору, и ветвление проверяется на полноту. Это часто лучше обычного наследования;
- делегирование встроено в язык отдельным ключевым словом, что делает композицию такой же короткой, как наследование.
Полезно упомянуть отличие абстракции от инкапсуляции, потому что их путают: первая про то, что показать наружу, вторая про то, как спрятать реализацию.
Где спотыкаются
Определяют инкапсуляцию как приватные поля с методами доступа.
Не различают абстракцию и инкапсуляцию.
Называют наследование главным принципом.
Не знают, что в Kotlin классы закрыты для наследования по умолчанию.