2015-01-11 5 views
-1

Есть ли способ указать необязательный метод в интерфейсе (чтобы контракт указывал только число/тип аргументов)?Интерфейс с необязательными методами

Просьба дать немного больше понимания и понимания проблемы и указать решение? См., Например, эту дискуссию: Optional Methods in Java Interface

В приложении я использую Слушатели, связанные с Устойчивостью (Доктриной). Поэтому я использую некоторые из этих методов:

prePersist() 
preUpdate() 
postPersist() 
postUpdate() 

и т.д.

Теперь, в то время как рефакторинг, так как существует слишком много Entities (объекты настаиваться), я решил разделить части этих методов в отдельные классы.

Однако не все из них нуждаются во всех методах до и после .... Мне нужно убедиться, что им задано соответствующее количество и тип аргументов. Как вы это делаете в PHP?

+0

@Marcin: это совершенно нормально, чтобы не знать, что такое интерфейс. Если этот вопрос может быть подвергнут критическому анализу (и он может), то некоторые предыдущие исследования/чтения могли бы быть доказаны, поэтому мы знаем, что конкретно нужно объяснить. – halfer

+0

См. Мой ответ. –

ответ

8

Нет. Вся идея интерфейсов заключается в заключении договора, который гарантирует, что существует метод.

Но класс может реализовывать несколько интерфейсов, поэтому вы можете определить другой интерфейс, содержащий этот метод, и не добавлять этот интерфейс к классу, который не имеет метода.

+0

См. Мое обновление. Я не собираюсь создавать несколько интерфейсов с предварительными и пост-методами. Это нелепо, не так ли? ;) – forsberg

+1

Нет, я так не думаю, но другим решением было бы просто добавить пустую реализацию функции. Вы можете рассмотреть возможность добавления пустых реализаций в базовый класс Entity и только переопределять их, когда это необходимо. Во всяком случае, вы должны иметь реализацию, если интерфейс объявляет эту функцию. Надо сказать, однако, что PHP не так строг, и (отсутствие) соблюдения правил интерфейса смешно. – GolezTrol

+0

Хорошо, спасибо за предложение. Я решил в значительной степени использовать упомянутый путь Java-обсуждения с одним интерфейсом. – forsberg

1

Интерфейсы не могут иметь необязательные методы. Это концепция интерфейса. Если вам требуется что-то дополнительно, я предлагаю дополнительно создать стандартную реализацию вашего интерфейса, который затем будет расширять все классы, которые вам нужны. Таким образом, все эти классы будут реализовывать интерфейс, и вы также сможете переопределить только выбранные методы, имеющие необязательное поведение.

Нечто подобное:

interface MyInterface { 
    public function method1(); 
    public function method2(); 
} 

затем Базовый класс реализует методы вашего интерфейса (я сделал это абстрактным, чтобы запретить прямое использование):

abstract class Base implements MyInterface { 
    public function method1() { 
     // dummy 
    } 
    public function method2() { 
     // dummy 
    } 
} 

, а затем:

class Optional extends Base { 
    // method1 is not overridden, so Base' implementation applies 

    public function method2() { 
    // something here 
    } 
} 
0

После прочтения ваших комментариев и интернета, я решил выбрать еще один вариант для дизайна приложения.

Я создал единый интерфейс со всеми (обязательными и необязательными) способами. Умножая количество интерфейсов для выполнения простой задачи (особенно в упомянутом случае), я считаю очень плохой подход. Это связано с тем, что Я считаю, что идея класса и интерфейса заключается в том, чтобы объединить все вместе, а не разделить их «искусственно» на отдельные «контейнеры». (Подумайте, например, о POPO в PHP/POJO в Java).

Теперь всем классам необходимо реализовать все потенциальные методы, но некоторые из них могут быть пустыми или вызывать исключение, как указано в обсуждении со ссылкой, приведенной выше, или GolezTrol в его комментарии. Спасибо за интерес, во всяком случае.

+0

Интерфейсы не должны разделяться на «искусственные» контейнеры, их следует разделять «логически». Интерфейсы используются для создания правильных логических абстракций в приложениях. Это зависит от класса реализации, если он хочет реализовать один или несколько интерфейсов. –

1

Я нашел интересную библиотеку, представляющую WeakInterfaces. Однако я не думаю, что было бы легко заставить его работать с Доктриной.

0

Пожалуйста, смотрите пример здесь:

interface Workable 
{ 
    public function work(); 
} 

interface Feedable 
{ 
    public function eat(); 
} 

interface Employee extends Feedable, Workable 
{ 
} 

class Human implements Employee 
{ 
    public function work() 
    { 
     // ....working 
    } 

    public function eat() 
    { 
     //.... eating in lunch break 
    } 
} 

// robot can only work 
class Robot implements Workable 
{ 
    public function work() 
    { 
     // ....working 
    } 
} 

Источник: https://github.com/jupeter/clean-code-php

Смежные вопросы