PHP: использовать родительский класс как typedeclaration в интерфейсе

Попробуйте здесь:

Справка ubuntu

прокрутите вниз до раздела FAT32 и FAT16.

2
задан 13 August 2018 в 14:23

2 ответа

Это запрещено, потому что это нарушает принцип замены Лискова:

Контравариантность аргументов метода в подтипе.

Это означает, что метод можно изменить, но только если вы расширите ограничение типа. На данный момент PHP не поддерживает реальный принцип замены Лискова . В это время вы можете использовать простое расширение типа параметра - это означает, что при реализации интерфейса вы можете опустить тип параметра.

1
ответ дан 15 August 2018 в 17:03

С точки зрения ООП: вы меняете подпись функции:

В реализации вы также должны использовать:

public function translate(Model $model){}

И вы можете передать аргументы типа MyModel для этого function

Все MyModel - это Model, но не все Model MyModel, вы можете иметь другие реализации Модели, которые могут быть переданы функции, но не являются MyModel.

EDIT1 : В соответствии с вашим комментарием:

вы можете проверить каждую имплиментацию, если это инстанс требуемого класса:

Class MyTranslator implements TranslatorInterface {
    public function translate(Model $model) { 
      if (is_a($model, 'MyModel')) {
      echo "yes, you use to translate MyModel \n";
      }
    }
}

В зависимости от контекста вы можете использовать это решение, но я думаю, что решение, использующее _constructor, лучше подходит для этого с небольшим изменением:

Class MyTranslator implements TranslatorInterface {
    public function __construct(Model $model) {
        $this->model = $model;
    }

    public function translate() {
        $this->model->doSomething();
        ...
    }
}

Вам нужен только один конструктор, и он будет использовать правильную имплиментацию на основе полиморфизма.

1
ответ дан 15 August 2018 в 17:03
  • 1
    Ну, это мой вопрос ... Скажем, у меня есть 3 ребенка модели ModelA, ModelB и ModelC. И для каждой модели у меня есть собственный переводчик TranslatorA, B и C. Все переводчики могут просто обрабатывать определенную модель TranslatorA только ModelA и т. Д., Но должны иметь функцию translate (). И я хочу предотвратить передачу неправильной модели в качестве аргумента, но хочу сказать, по крайней мере, в интерфейсе, что это должен быть какой-то тип этого родителя. Кажется, это невозможно? Я знаю, что это редкий случай, и еще одно решение / добавить к моему решению - TranslatorFactory - просто интересно, почему это запрещено. – bibamann 13 August 2018 в 14:37

Другие вопросы по тегам:

Похожие вопросы: