一、Traits简单介绍
在计算机编程中,Traits是面向对象编程中使用的一种概念,它表示一组可用于扩展类功能的方法。
二、Traits特点
Traits提供了一组实现行为的方法,并要求类实现一组参数化所提供行为的方法。
对于对象间的通信(以及对象之间的共享),特性在面向对象的协议(接口)和mixin之间有所不同。界面可以通过方法签名来定义一个或多个行为,而特征通过完整的方法定义来定义行为:即,它包括方法的主体。相比之下,mixin包含完整的方法定义,并且还可以通过成员变量携带状态,而特征通常不会。
因此,被定义为特征的对象被创建为方法的组合,其可以被其他类使用而不需要多重继承。在命名冲突的情况下,当一个类所使用的多个特征具有同名的方法时,程序员必须明确地消除这些方法中将使用哪一种方法;从而手动解决多重继承的钻石问题。这与面向对象编程中的其他构成方法不同,在这种方法中,冲突的名称可以通过范围规则自动解决。
尽管mixin只能使用继承操作构成,但特征提供了更广泛的操作选择,包括:
对称和:合并两个不相交特征以创建新特征的操作;
重写(或不对称总和):通过向现有特征添加方法形成新特征的操作,可能会覆盖其某些方法;
别名:通过为现有方法添加新名称来创建新特征的操作;
排除:通过从现有特征中移除方法形成新特征的操作。 (将它与别名操作组合会产生浅层重命名操作)。
特质的构成方式如下:
性状组成是可交换的;添加特征的顺序并不重要。例如,给定性状S = A + B,则性状T = B + A与S相同。
冲突的方法被排除在组合物之外。
冲突的方法被排除在组合物之外。
三、代码示例
允许模拟多重继承的方面:
trait TBounding{
public
$x, $y, $width, $height;
}
trait TMoveable{
public
function moveTo($x, $y) {
// … }}trait TResizeable{
public function resize($newWidth, $newHeight) {
// … }}class Rectangle{
use TBounding, TMoveable, TResizeable;
public function fillColor($color) {
// … }}