有时用户不想透露婚姻状况,这在我的领域中很好。所以我有用户是否已婚的数据,我有我不知道状态的数据。我的目标是确保下面的婚姻状况检查功能仅返回单一类型的数据。虽然我使用的是 php,但我确信这适用于任何语言。
这是界面
interface MaritalStatusInterface
{
public function status(): ?bool;
}
这意味着状态可以返回真或假,在某些情况下为空。这是我的实现。
class MaritalStatus implements MaritalStatusInterface
{
const SINGLE = 0;
const MARRIED = 1;
private $status;
public function __construct(int $status)
{
if($status !== self::SINGLE && $status !== self::MARRIED)
{
throw new \InvalidArgumentException("Given marital status '$status' is invalid. Marital status should be either single as " . self::SINGLE . " or married as " . self::MARRIED, 7263);
}
$this->status = $status;
}
public function status(): ?bool
{
return ($this->status)?true:false;
}
}
现在,当我无法获取婚姻状况数据时,这是 null 对象。
class NullMaritalStatus implements MaritalStatusInterface
{
private $status;
public function __construct()
{
$this->status = null;
}
public function status(): ?bool
{
return $this->status;
}
}
我的问题是我无法拆分 Null 对象和真实对象状态函数的返回类型。根据我的理解,使用空对象模式的主要好处是函数更容易预测,就好像它是 bool 返回类型,那么它将总是返回 bool。
如何重构我的代码,以便函数
public function status(): ?bool
可以写成
# for MaritalStatus class
public function status(): bool
和
# for NullMaritalStatus class
public function status(): null
甚至可能吗?这肯定不符合 MaritalStatusInterface。我不确定使用多个接口是否可以解决它。还是我以一种完全错误的方式看待它,并且拥有可为空的返回类型并没有错?