пример 2 и только
Обьясню
Например, SomeClass - сервис логгирования.
Тогда сделаем ему интерфейс, создадим 2 подтипа - логер на файлах и в БД.
Итого 1 интерфейс, 2 класса реализации.
Параметры метода описаны в интерфейсе..
Вот и имеем, что метод будет вызван с конкретным аргументом...
В других случаях не понятно поведение подклассов, которые будут это реализовать.. А именно в плане того, что должен делать setItem в 1 случае, и ессно интерфейсы не могут описывать конструкторы как в примере 3...
В итое имеем, что можно легко заменить объект другим объектом ТОЛЬКО в примере 2.
Насчет геттеров - имхо, лучше создавать приватные свойства и геттер+сеттер
Т.к. на больших проектах чаще всего получается лапша, да и в плане многопоточности, и опять же-интерфейсов -просто свойства не есть хорошо...