Я пытаюсь разработать некоторую иерархию классов, и я «застрял» в этой части.
Допустим, у меня есть следующие классы
abstract class Video
{
const TYPE_MOVIE = 1;
const TYPE_SHOW = 2;
abstract public function getTitle();
abstract public function getType();
}
class Movie extends Video
{
// ...
public function getType()
{
return self::TYPE_MOVIE;
}
}
class Show extends Video
{
// ...
public function getType()
{
return self::TYPE_SHOW;
}
}
В другой части системы у меня есть класс (Parser), который инкапсулирует создание фильмов и объектов шоу и возвращает obj. клиенту.
Вопрос: Как лучше всего получить тип объекта. возвращается из парсера/фабричного класса, так что клиент может сделать что-то вроде
$video = $parser->getVideo('Dumb and Dumber');
echo $video->getTitle();
// Way 1
if($video->getType == 'show') {
echo $video->getNbOfSeasons();
}
// Way 2
if($video instanceof Show) {
echo $video->getNbOfSeasons();
}
// Current way
if($video->getType == Video::TYPE_SHOW) {
echo $video->getNbOfSeasons();
}
Есть ли лучший способ, чем мое решение (читай: мое решение отстой?)?