Scala 特质

DataCamp 最近推出了他们的第一门 Scala 课程:Scala 入门。去看看吧!

您可能还感兴趣阅读以下教程:

简介

特质是一个主要在面向对象编程中使用的概念,它可以通过一组方法来扩展一个类的功能。

特性在精神上与Java编程语言中的接口相似。与类不同,Scala特性不能被实例化,也没有参数或参数。但是,你可以使用类和对象来继承(扩展)它们。说到这里,特性提供了一组特定的方法/函数,这些方法/函数将行为执行到类中,并期望该类实现一组方法,然后参数化提供的行为。

用于定义对象的特性是作为一组方法创建的,这些方法可以被不同的类使用,而无需多重继承。然而,可能会有例外情况,其中两个特性有一个同名的方法(命名冲突),这必须由一个类使用,在这种情况下,必须明确解决模糊性。

特性可以有抽象非抽象方法、字段作为其成员。当你在特性中没有初始化一个方法时,那么它们就是抽象的,而被初始化的则称为非抽象。在抽象方法中,实现特性的类负责初始化。

现在,让我们通过一些例子来快速了解Scala特性!

Scala 特性语法

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

trait Trait_Name{ // 变量 // 方法 }

从上面的特性定义中,正如您所看到的,定义了一个名为DataCamp的特性,其中没有定义变量和方法。

让我们来看一个Scala特性的简单示例,这将让您更清楚地了解它们是如何程序化工作的。

正如在介绍中讨论的,Scala特性通过使用extends关键字被类继承。

class Scala_Tutorial extends DataCamp{ // 变量 // 方法 }

让我们定义一个名为Scala_Course的特性,它将被DataCamp类继承。在trait中,您将定义一个名为抽象方法scala()方法,它将在DataCamp类中定义。

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def scala(){ println("DataCamp has recently launched there first Scala course") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.scala() } }

现在让我们运行上述代码。

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

但是如果特性中已经实现了一个方法(非抽象)呢?嗯,在这种情况下,扩展这个特性的类不需要实现已经在特性中实现的方法。

让我们通过一个小例子来理解这个问题。

trait BMW{ // trait 变量 var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 // trait 方法:非抽象 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{ // 类变量 var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 // 类方法 def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // 主方法 def main(args: Array[String]) { // 类对象 var obj = new Car(); println("Calling the Class Method") obj.Merc_Specs(); println("Calling the Trait Method") obj.Display(); } }

让我们运行上述代码:

既然你已经理解了抽象非抽象方法的区别,让我们看看当一个抽象方法在继承或扩展它的类中没有实现时,会出现什么问题。

让我们用相同的例子来理解这个概念。

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def print(){ println("Error: Class DataCamp needs to be Abstract") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.print() } }

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

要使上述代码正常工作,有两种可能的解决方案:

  • DataCamp类中定义scala()方法,或
  • 将DataCamp类定义为抽象

今天教程的最后一个话题是如何在一个类中继承多个trait。所以,我们快速完成它。

trait A{ // 方法 } trait B{ // 方法 } 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 { // 主方法 def main(args: Array[String]) { // 类对象 var obj = new Car(); println("Calling the BMW Trait") obj.BMW_Specs(); println(); println("Calling the Merc Trait") obj.Merc_Specs(); } }

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

恭喜!

恭喜你完成本教程。

现在你知道编程中的 Traits 是什么以及如何在 Scala 中使用它。一个好的练习是为未在继承它的类中定义的抽象方法找到解决方案。尝试编写相同的代码,看看代码是否能在没有编译错误的情况下运行。一个小提示,你可能想看看 Scala 中的抽象类。

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

最后,不要忘记在 DataCamp 上参加新的 Scala 课程,Scala 入门

Source:
https://www.datacamp.com/tutorial/scala-traits