Можно ли объявить в абстрактном классе абстрактное свойство (в PHP)?
Доброго времени суток. Недавно на собеседовании столкнулся с вопросом, который мне до сих пор не даёт покоя. Вопрос звучал так: "Можно ли в абстрактном классе объявить абстрактное свойство и если нет, то почему?". Подсознательно понимаю, что нельзя, т.к. это не правильно (наверное). Но не уверен в этом и не могу сформулировать, почему нельзя. Есть у кого какие мысли по этому поводу? Можно ли, и если нельзя, то почему? =)
На ответ почему, я бы ответил что свойства класса могут принимать значения только элементарных типов данных и не могут иметь реализации в виде функции как таковой.
Ну, возможно, имелось ввиду то, что объявив свойство абстрактным мы обяжем классы-потомки определить свойство с таким именем... Почему нельзя так делать?)
P.S. Не подумайте, что я придираюсь. Мне вообще кажется, что самым правильным ответом на вопрос "почему нельзя", является "потому что". Просто хотелось бы услышать мнения по этому поводу)
froosty: Если вы объявите в абстрактном классе свойство - оно и так будет унаследовано его потомками, реализовывать его не надо. Если оно не private конечно.
Ну смотрите, когда мы объявляем метод с abstract, мы обязываем потомков реализовать этот метод. И когда где-то в коде мы проверяем, что класс B унаследован от класса A, а в абстрактном классе A мы указали абстрактный метод "something", мы можем быть уверены, что в классе B есть этот метод и мы можем к нему обратиться. Так почему не правильно, скажем, объявить в классе А абстрактное свойство field, чтобы в коде, после проверки того, что класс В является потомком класса A, мы были уверены, что в классе B есть св-во field с конкретным значением установленным в классе B, т.к. мы его обязали это сделать?
froosty: потому что если вы объявите это свойство в классе А оно уже будет в классе B. Сделайте конструктор для класса A и заполняйте там это свойство. если это не подходит, значит вся ответственность переходит на разработчиков реализующих\использующих класс B.
То, что Вы пытаетесь сделать, звучит примерно как: "я хочу обязать всех передавать только правильные параметры при вызове моих функций" ... это лишнее :)
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.