@vasx3

Как происходит выбор реализации интерфейса?

Подскажите, как происходит выбор реализации интерфейса когда один интерфейс реализуют несколько классов?

Допустим, у нас есть интерфейс машины
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, а интерфейс использовать только для стандартизации?
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Griglapidus
К интерфейсу не надо относиться как к типу данных. Вы не вызываете метод интерфейса, вы вызываете метод класса наследованного от интерфейса. Вы же не создаете объект тип ICar. Вы создаете объект типа Sportcar и через интерфейсные методы ICar вы обращаетесь к объекту типа Sportcar.
Ответ написан
@soloveid
Среда выполнения знает какая именно реализация (Bus или Sportcar) стоит за ICar и именно методы
этого класса и вызывает.
Это происходит так потому, что в начале памяти, где находится этот объект, указан его тип (Bus или Sportcar).

upd.
Грубо говоря, мне непонятно, в каком случае при использовании переменной ICar $car будет получен объект Sportcar, а в каком объект Bus?
Или лучше сразу получать переменную типа Sportcar или Bus, а интерфейс использовать только для стандартизации?


Не совсем понятно, зачем Вам это знать? Для этого и есть интерфейсы. Если Вы вдруг хотите значить, какой именно тип и в этом случае выполнить какой-то отдельный код, то это нехорошо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы