我在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
上的抽象方法。