1. Если из класса можно вытащить какую-то абстракцию. Например, из объекта «файл» можно вытащить абстракцию «поток». Личное — объект Project реализует интерфейс Modifiable с двумя функциями: modify() и isModified().
2. Для упрощения юнит-тестирования при условии владения.
Предположим, у нас есть класс «класс» (школьный) и класс «ученик». Ученик знает, в каком он классе.
В такой ситуации получается «клубок»: если надо делать ученика, то надо делать и класс.
Этот замкнутый круг можно разорвать, сделав интерфейс ISchoolClass и унаследовав от него класс. При юнит-тестировании заменяем класс на какую-то заглушку.