📜  作为可堆叠修改的特征

📅  最后修改于: 2022-05-13 01:55:50.704000             🧑  作者: Mango

作为可堆叠修改的特征

特征类似于 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