Scala 中的 Trait 线性化

Scala | 特性线性化

在Scala编程语言中,特质线性化是一种属性,当创建使用来自不同类和特征的多个继承定义的类的实例时,该属性有助于纠正歧义。 

它解决了当类或特质从两个不同的父级(它们可能是类或特质)继承财产时可能出现的歧义。

语法:

trait t1{}
class c1{}
class main{}
object obj1 = new class main extents c1 with t1

在这里线性化将使继承结构清晰明了,以便将来不会出现任何问题。

在这里,我们将考虑两个根类,所有引用类型的AnyRef根。Scala中所有类的任何根。

线性化

t1 -> AnyRef -> Any
c1 -> AnyRef -> Any
main -> AnyRef -> Any
obj1 -> main -> t1 -> c1 -> AnyRef -> Any

这里线性化将按照以下顺序进行:main class -> t1 trait -> c1 class -> AnyRef -> Any

该示例程序将使概念更清晰,

class vehicle 
{ 
	def method: String= "vehicle "
} 

trait bike extends vehicle 
{ 
	override def method: String = "Bike-> "+ super.method 
} 

trait muscleBike extends vehicle 
{ 
	override def method: String = "Muscle Bike -> "+ super.method 
} 

trait harley extends vehicle 
{ 
	override def method: String ="Harley Davidson-> "+ super.method 
} 

class iron extends bike with
muscleBike with harley 
{ 
	override def method: String = "Iron 833 -> "+ super.method 
} 

object myObject 
{ 
	def main(args: Array[String]) 
	{ 
		var myBike = new iron 
		println(myBike.method) 
	} 
}

输出结果

Iron 833 -> Harley Davidson-> Muscle Bike -> Bike-> vehicle

特质线性化的特征

  • 它用于解决Scala中的多重继承时出现的歧义。

  • 子类对super方法的调用是使用堆栈管理的。

  • 当创建一个新的类实例时,线性化就起作用了。

  • 线性化可能与继承的mixin不同,因为mixin由程序员定义。

  • 线性化避免了重复的继承,如果我们显式地尝试向继承中添加类,则会抛出错误。