在Hack PHP中限制函数重写的不变量



我在PHP Hack中有一个基类,它有一个函数:

// This method is used to return just one Apple Type
protected static function Apple(): AppleType {
return AppleType;
}

现在我有两种类型的类——一种使用基本特征,另一种不使用。

该特性具有以下功能:

// This method is used to return more than one Apple Type
protected static function Apples(): keyset[AppleType] {
return keyset[AppleType];
}

不使用此特性的子类可以覆盖基类Apple((方法。但是,使用trait的类必须覆盖Apples((,而不是Apples(。

现在我想提供一个不变的异常:

类似于:

invariant(Apple() is not overridden in this class, 'Class must override Apples() and not Apple()');

即不变量,以强制使用trait的类在运行时不能覆盖基类的Apple[(]并抛出异常。

请帮我写这个不变量。我尝试了很多方法,但不知怎么的,效果不好。

您可以用final方法定义一个类,并要求trait用户扩展该类。

enum AppleType: int {
Fresh = 1;
Stale = 2;
}
class Overridable {
protected static function Apple(): AppleType {
return AppleType::Fresh;
}
}
class MustUseApples extends Overridable {
<<__Override>>
final protected static function Apple(): AppleType {
return parent::Apple();
}
}
trait MyTrait {
require extends MustUseApples;
protected static function Apples(): keyset<AppleType> {
return keyset[AppleType::Stale];
}
}

但是,如果您想要求trait用户必须提供Apples的实现,那么您可能应该将其作为MustUseApples上的抽象方法。

相关内容

  • 没有找到相关文章

最新更新