Подскажите, как происходит выбор реализации интерфейса когда один интерфейс реализуют несколько классов?
Допустим, у нас есть интерфейс машины
interface ICar {
start();
stop();
}
Его реализуют несколько классов
class Sportcar implements ICar {
start() {
/**/
}
stop() {
/**/
}
//nitro() {
// /**/
//}
}
class Bus implements ICar {
start() {
/**/
}
stop() {
/**/
}
//openDoor() {
// /**/
//}
}
В конечном методе можно получить объект по типу интерфейса и оно будет работать
function startCar(ICar $car) {
$car->start();
Но как происходит выбор класса который, в конечном итоге, возвращается в методе?
(неактуально)Как можно быть уверенным, что мне вернётся объект класса Bus, и что в нём будет метод openDoor?
Я пытаюсь вникнуть в необходимость использования абстракций.
Везде говорится, что необходимо отделять отдельные части приложения, использовать классы не напрямую, а через интерфейсы чтобы убрать зависимости.
Но я не могу понять, как в случае использования интерфейсов я могу быть уверенным в соответствии получаемых данных.
Получается как-то не прозрачно.
upd.
Грубо говоря, мне непонятно, в каком случае при использовании переменной
ICar $car будет получен объект
Sportcar, а в каком объект
Bus?
Или лучше сразу получать переменную типа
Sportcar или
Bus, а интерфейс использовать только для стандартизации?