クラス階層を設計しようとしていますが、この部分で「行き詰まり」ました。
次のクラスがあるとしましょう
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;
}
}
システムの別の部分には、映画とショーのオブジェクトの作成をカプセル化し、obj を返す (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();
}
私の解決策よりも良い方法はありますか (読む: 私の解決策は悪いですか?)?