作为可堆叠修改的特征
特征类似于 Java 的接口。类和对象可以扩展特征,但特征不能被实例化,因此没有参数。它还支持多重继承。特征是使用trait关键字创建的。
句法:
trait Trait_Name {
// Fields..
// Methods..
}
super 关键字:当基类和子类具有相同名称的方法时使用它,因此为了解决歧义,我们使用 super 关键字来调用基类方法。
具有特征的可堆叠修改
在此之前,首先我们应该借助示例了解什么是可堆叠修改。 考虑一个付费给手机充值的客户,以使用语音通话、互联网等移动服务。这些服务可以根据特定用户的使用情况分为不同的套餐。如果我们想实现这项服务,我们需要知道客户为特定包裹付费的包裹的名称,比如说DataPack 。所以我们可以说以下。
new Recharge with DataPack
假设我们在 Recharge 类中具有特定的价值,该类具有特定包中列出的服务列表。如果消费者想要再充值一包,我们不希望有一种机制会为我们显式修改服务列表,但默认情况下应该会发生这种情况。这就像随着我们不断添加不同的包而被修改的行为。这种情况让我们了解了可堆叠修改的概念。随着客户添加新包装,列表将不断更新。
new Recharge with DataPack with FullTalkTime
Scala 支持使用类或特征对任何方法进行可堆叠修改,这意味着您可以通过将类和特征混合在一起来选择非常特定的行为。当您通过一遍又一遍地覆盖相同的方法来堆叠新特征时,您的方法将获得不同的或附加的行为。
以下示例说明了如何堆叠特征。
示例 1:
在此示例中,我们使用特征以可堆叠的方式使用特征来修改类的方法。在这里,我们使用 super 关键字在两个特征中调用 dot() 方法。这样,我们就实现了可堆叠的修改。在可堆叠修改的情况下,方法调用顺序由线性化规则确定。
Scala
// Scala program to illustrate traits
// in stackable fashion
// Defining class shape
class Shape
{
def dot(shape : String) = println("Dotted : " + shape)
}
// Using trait keyword
// Using super keyword
trait Square extends Shape
{
override def dot(shape : String) = super.dot("Square-" + shape)
}
// Using trait keyword
// Using super keyword
trait Circle extends Shape
{
override def dot(shape : String) = super.dot("Circle-" + shape)
}
// Using trait keyword
// Using super keyword
trait Sharp extends Shape
{
override def dot(shape : String) = super.dot("Sharp-" + shape)
}
// Defining main
object Shapes
{
def main(args: Array[String])
{
val shape1 = new Shape with Sharp with Square
shape1.dot("Shape-1")
val shape2 = new Shape with Circle with Sharp
shape2.dot("Shape-2")
}
}
Scala
// Scala program to illustrate traits
// in stackable fashion
// Defining class Ball
class Ball
{
def spin(ball : String) = println("Spinning : " + ball)
}
// Using trait keyword
// Using super keyword
trait Yellow extends Ball
{
override def spin(ball : String) = super.spin("Yellow-" + ball)
}
// Using trait keyword
// Using super keyword
trait Blue extends Ball
{
override def spin(ball : String) = super.spin("Blue-" + ball)
}
// Using trait keyword
// Using super keyword
trait Shiny extends Ball
{
override def spin(ball : String) = super.spin("Shiny-" + ball)
}
// Defining main
object Balls
{
def main(args: Array[String])
{
val ball1 = new Ball with Shiny with Yellow
ball1.spin("Ball-1")
val ball2 = new Ball with Blue with Shiny
ball2.spin("Ball-2")
}
}
输出:
Dotted : Sharp-Square-Shape-1
Dotted : Circle-Sharp-Shape-2
示例 2:
斯卡拉
// Scala program to illustrate traits
// in stackable fashion
// Defining class Ball
class Ball
{
def spin(ball : String) = println("Spinning : " + ball)
}
// Using trait keyword
// Using super keyword
trait Yellow extends Ball
{
override def spin(ball : String) = super.spin("Yellow-" + ball)
}
// Using trait keyword
// Using super keyword
trait Blue extends Ball
{
override def spin(ball : String) = super.spin("Blue-" + ball)
}
// Using trait keyword
// Using super keyword
trait Shiny extends Ball
{
override def spin(ball : String) = super.spin("Shiny-" + ball)
}
// Defining main
object Balls
{
def main(args: Array[String])
{
val ball1 = new Ball with Shiny with Yellow
ball1.spin("Ball-1")
val ball2 = new Ball with Blue with Shiny
ball2.spin("Ball-2")
}
}
输出:
Spinning : Shiny-Yellow-Ball-1
Spinning: Blue-Shiny-Ball-2