2012-01-06 4 views
2

У меня есть класс ParentClass(), некоторые детские классы ChildClass1(), ChildClass2() и т. Д. И интерфейс iChild(). В ChildClass() наследует от ParentClass() и орудие iChild():Интерфейсы: требуется абстрактная константа?

class ChildClass1 
    extends ParentClass 
    implements iChild {} 

class ChildClass2 
    extends ParentClass 
    implements iChild {} 

В iChild() -Интерфейсе, Я хотел бы требовать, что некоторые константы должны быть заполнены (которые в основном идентификаторы и некоторые определения функциональности). Я не нашел никакого смысла это делать, поскольку константы могут быть определены только в интерфейсе, но которые не переопределяются в реализующих классах. Единственным обходным решением, которое я нашел, является определение некоторых геттер-функций в iChild(), которые, в свою очередь, возвращают необходимые значения, но это, похоже, не является правильным способом. Поскольку я уже простираюсь от ParentClass(), я также не могу использовать абстрактный класс, например. проверьте определение требуемых констант во всех ChildClasses.

Любые идеи о том, как решить эту проблему?


Update: Чтобы ответить на комментарий - с более компактной и более читаемым я имею в виду следующее:

class ChildClass1 { 
    const MY_NAME = "Foo Bar Name 1"; 
} 

-- vs -- 

class ChildClass1 { 
    public function GetMyName() { 
     return "Foo Bar Name 1"; 
    } 
} 

Я нашел первый пример намного более читаемым и понятным, чем второй. К сожалению, в настоящее время у меня нет способа заставить MY_NAME установить ChildClasses.

ответ

3

Я не уверен, что правильное решение здесь для константы. Само определение константы состоит в том, что оно не меняется. Если для каждой реализации iChild необходимо определить константу, она не является константой, она является переменной. Я предлагаю добавить в соответствующие методы getter, сообщая пользователю, что им необходимо предоставить эту информацию в своей реализации.


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

+0

Вот как я его реализовал, но я бы скорее назвал константу, чем метод. Он более компактный и «чувствует себя более правильным». Спасибо за ваш ответ. – Lars

+1

Как он компактен и «чувствует себя более правильно»? В любом случае не должно быть разных реализаций, которые определяют разные константы, не привязывая себя к имени классов реализации. – cspray

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