用trait实现多继承,怎么限定参数类型呢?
使用trait实现多继承,但是无法限定参数的类型。例如下面的例子
trait T{
function t(){
echo 'trait';
}
//省略其他很多代码
}
class B{ } // 假设 B 是一个三方模块
class C extends B{ // 假设 C 必须继承三方模块 B
use T;
}
// 以下客户端代码里面的某些类里面的某些函数可能需要使用到 T 中的若干方法,类似下面这样
function f(T $t){
// 确保 t() 可以被调用,于是限定参数类型,但是有问题
$t->t();
}
f(new C);
沙箱测试发现报错 Fatal error: Uncaught TypeError: f(): Argument #1 ($t) must be of type T, C given
如果把f(T $t)
改成f(C $t)
则没问题,但这不是我想要的。
如果把trait改成接口的话也不行,因为接口里面不能写函数体。
如果把trait改成类的话也不行,因为 C 已经继承了一个类,无法再继承另一个类。
究竟怎样做才能既可以实现多继承又可以限定类型呢?
推荐文章: