Scala特质用法

srcmini最近在该处开设了第一个Scala课程:Scala简介。看看这个!

你可能也有兴趣阅读以下教程:

  • Scala初学者指南
  • IF ELSE在Scala
  • Scala中的运算子
  • Scala中的列表
  • Scala类和对象

介绍

特性是一种主要用于面向对象编程的概念, 它可以使用一组方法来扩展类的功能。

特性在本质上与Java编程语言中的接口相似。与类不同, Scala特性无法实例化且没有参数或参数。但是, 你可以使用类和对象继承(扩展)它们。话虽如此, 特征提供了一组特定的方法/函数来执行对类的行为, 并期望该类实现一组方法, 然后对提供的行为进行参数化。

创建用于定义对象的特征作为方法的混合, 这些方法可以由不同的类使用, 而无需多个继承。但是, 可能存在离群值, 其中两个特征具有相同名称的方法(命名冲突), 这必须由类使用, 在这种情况下, 必须明确解决歧义。

特性可以具有抽象方法和非抽象方法, 字段可以作为其成员。如果你没有在特征中初始化方法, 则它们是抽象的, 而被初始化的方法称为非抽象的。在抽象方法中, 实现特征的类负责初始化。

现在, 让我们借助一些示例快速了解Scala特性!

Scala特性语法

Scala特性的语法很简单, 它由关键字trait以及其名称定义。

trait Trait_Name{
// Variables
// Methods
}
Scala特质1

从上面的特征定义可以看到, 定义了一个名为srcmini的特征, 其中没有定义任何变量和方法。

让我们来看一个Scala特性的简单示例, 它将使你更加清楚地了解它们如何以编程方式工作。

如引言中所述, Scala特性由类使用extends关键字继承。

class Scala_Tutorial extends srcmini{
// Variables
// Methods
}

让我们定义一个名为Scala_Course的特征, 它将由srcmini类继承。在特征内, 你将定义一个名为scala()的抽象方法, 该方法将在srcmini类中定义。

trait Scala_Course{  
    def scala()  
}  

class srcmini extends Scala_Course{  
    def scala(){  
        println("srcmini has recently launched there first Scala course")  
    }  
}  

object Main{  
    def main(args:Array[String]){  
        var a = new srcmini()  
        a.scala()  
    }  
}

现在让我们运行上面的代码。

Scala特质2

在上面的示例中, 方法scala()是抽象方法, 因此, 声明是在继承该特性的类中进行的。

但是, 如果你具有已在特征中实现的方法(非抽象)怎么办?好吧, 在那种情况下, 扩展此特征的类不必实现已经在特征中实现的方法。

让我们借助一个小例子来理解这一点。

trait BMW{

    // trait variables
    var make: String = "BMW"
    var model: String = "X7"
    var fuel: Int = 40

    // trait method: NON-ABSTRACT
    def Display()
    {
        println("Make of the Car : " + make);
        println("Model of the Car : " + model);
        println("Fuel capacity of the Car : " + fuel);
    }
}


class Car extends BMW{
    // class variables
    var make1: String = "Mercedes Benz"
    var model1: String = "S350D"
    var fuel1: Int = 50

    // Class method
    def Merc_Specs()
    {
        println("Make of the Car : " + make1);
        println("Model of the Car : " + model1);
        println("Fuel capacity of the Car : " + fuel1);
    }
}

object Main  
{

    // Main method
    def main(args: Array[String])  
    {

        // Class object
        var obj = new Car();
        println("Calling the Class Method")
        obj.Merc_Specs();
        println("Calling the Trait Method")
        obj.Display();
    }
}

让我们运行上面的代码:

Scala特质3

既然你已经了解了抽象方法与非抽象方法之间的区别, 那么让我们看看如果在继承或扩展抽象类的类中未实现抽象方法时可能会出问题。

让我们使用相同的示例来理解此概念。

trait Scala_Course{  
    def scala()  
}  

class srcmini extends Scala_Course{  
    def print(){  
        println("Error: Class srcmini needs to be Abstract")  
    }  
}  

object Main{  
    def main(args:Array[String]){  
        var a = new srcmini()  
        a.print()  
    }  
}

运行上面的代码会导致错误, 如下所示, 因为你没有在继承它的类中定义trait方法scala()(抽象)。

Scala特质4

为了使上面的代码起作用, 可以有两种可能的解决方案:

  • 在类srcmini中定义scala()方法或
  • 将srcmini类定义为抽象。

本教程的最后一个主题是如何在一个类中继承多个特征。因此, 让我们快速完成它。

trait A{
// methods
}
trait B{
// methods
}
class C extends A with B{
}
trait BMW{


    var make: String = "BMW"
    var model: String = "X7"
    var fuel: Int = 40
}

trait Merc{


    var make1: String = "Mercedes Benz"
    var model1: String = "S350D"
    var fuel1: Int = 50


}



class Car extends BMW with Merc{

    def BMW_Specs()
    {
        println("Make of the Car : " + make);
        println("Model of the Car : " + model);
        println("Fuel capacity of the Car : " + fuel);
    }


    def Merc_Specs()
    {
        println("Make of the Car : " + make1);
        println("Model of the Car : " + model1);
        println("Fuel capacity of the Car : " + fuel1);
    }

}


object Main  
{

    // Main method
    def main(args: Array[String])  
    {

        // Class object
        var obj = new Car();
        println("Calling the BMW Trait")
        obj.BMW_Specs();
        println();
        println("Calling the Merc Trait")
        obj.Merc_Specs();
    }
}

最后, 让我们运行上面的代码。

Scala特质5

祝贺你完成本教程。

你现在知道编程中的特质是什么, 以及如何在Scala中使用它。一个不错的练习是在继承方法的类中未定义抽象方法时, 为它找到解决方案。尝试编写相同的代码, 然后查看代码是否在运行时没有任何编译错误。一个小技巧, 你可能想看看Scala中的Abstract Classes。

请随时在下面的评论部分中提出与本教程相关的任何问题。

最后, 不要忘了参加有关srcmini的新Scala课程” Scala简介”。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?