AnrDaemon
Продвинутый новичок
Это снова я… я всё ещё мучаю свою семейку классов. Где-то я её уже приводил, но мне лень искать, так что опишу сначала.
Есть семейство классов, каждый является уточнением предыдущего, со слегка большим набором параметров, чем родительский класс.
Грубо, это
Галактика -> Система -> Звезда -> Планета
У всех классов есть общие методы (__toString, implements Countable, ArrayAccess, такая хрень).
Сначала я так и поступил, сделал абстрактнй класс, описал там общую логику, и поунаследовал от него всех потомокв, но…
Но захотелось более строгой валидации входных параметров некоторых функций, таких как XXX::addChild(). Если определять addChild в абстранктном классе ( function XXX::addChild(self $child); ), то либо галактики будут чилдами систем, либо придётся наворачивать дополнительные проверки внутри метода в каждом классе.
Есть правильное решение этой проблемы? Может, вынести эти функции в интерфейсы?
И делать что-то типа
Есть семейство классов, каждый является уточнением предыдущего, со слегка большим набором параметров, чем родительский класс.
Грубо, это
Галактика -> Система -> Звезда -> Планета
У всех классов есть общие методы (__toString, implements Countable, ArrayAccess, такая хрень).
Сначала я так и поступил, сделал абстрактнй класс, описал там общую логику, и поунаследовал от него всех потомокв, но…
Но захотелось более строгой валидации входных параметров некоторых функций, таких как XXX::addChild(). Если определять addChild в абстранктном классе ( function XXX::addChild(self $child); ), то либо галактики будут чилдами систем, либо придётся наворачивать дополнительные проверки внутри метода в каждом классе.
Есть правильное решение этой проблемы? Может, вынести эти функции в интерфейсы?
И делать что-то типа
PHP:
interface ISolarsystem {
function addChild(ICelestial $child);
}
class Solarsystem extends XXX implements ISolarsystem {
function addChild(ICelestial $child) {};
};