Интерфейсы: требуется абстрактная константа? - PullRequest
2 голосов
/ 07 января 2012

У меня есть класс ParentClass(), несколько дочерних классов ChildClass1(), ChildClass2() и т. Д. И интерфейс iChild(). ChildClass() наследуется от ParentClass() и реализует iChild():

class ChildClass1 
    extends ParentClass 
    implements iChild {}

class ChildClass2 
    extends ParentClass 
    implements iChild {}

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

Есть идеи, как решить эту проблему?


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

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

-- vs --

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

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

1 Ответ

3 голосов
/ 07 января 2012

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...