Scala 类与对象

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

同时,也看看以下教程:

介绍

Source

一般来说,面向对象编程(OOP)由类和对象组成,旨在实现像多态和继承这样的现实世界实体。

OOP使开发更快、更便宜,同时也提高了软件的可维护性。这种魔法的主要原因是它支持的功能数量;你有类和对象,可以根据需要轻松地在将来重用,与缺乏类和对象的程序形成对比。这反过来又导致了高质量的软件,这种软件还可以通过新的方法和属性进行扩展。

假设你有一个汽车展览室;每几个月,一款新车问世,为了告知观众它的名字和特性,你不得不从零开始定义新的方法和属性。然而,如果你有一个面向对象的程序,它有一个汽车类,你将只需添加一个新汽车的对象,它将调用类的属性和方法,传递该车辆的信息。

类可以被看作是对象的一种表示或设计。类通常会有自己的方法(行为)和属性

属性是区分每个对象和其他对象的个人实体,并确定对象的多种品质。另一方面,方法更像是在编程中通常如何执行函数。它们决定了类实例如何工作。很大程度上是因为方法(行为),对象才有能力对它们进行操作。

Source

上面的图片让你对面向对象编程的流程有更直观的了解,或者更具体地说,类的样子。在上面的图片中,有一个class car类,它有属性:燃料,最大速度,还可以有其他属性,如型号制造等。它有不同的一组方法,如refuel()getFuel()setSpeed(),还有一些其他的方法,如换挡启动引擎停止引擎等。

所以,当你谈论一辆特定的汽车时,你将有一个对象,它是类的一个实例。

让我们来谈谈Scala中的面向对象编程。

Scala中的类和对象

与C++和Java类似,Scala中的面向对象编程遵循几乎相同的约定。它有定义对象的概念,以及在类构造函数内部,这就是Scala面向对象编程的全部。

类声明

class Class_name{ // 方法和属性 }

在Scala中,类是通过关键字class加上类名来定义的,通常类名以大写字母开头。在Scala类声明中有几个可选的关键字,例如:类名应以大写字母开始:超类,是使用extend关键字前导的父类名:特质,是由逗号分隔的列表实现类,使用extend关键字前导。

在Scala中,一个类只能继承一个父类,这意味着Scala不支持多重继承。但是,使用特质可以实现在这一点。

最后,Scala中类的主体由花括号{}包围。

// 类名是Car class Car { // 类变量 var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 // 类方法 def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } object Main { // 主方法 def main(args: Array[String]) { // 类对象 var obj = new Car(); obj.Display(); } }

您可以将上述代码保存为class.scala的文件,然后在终端中运行它,命令是scala class.scala,您应该会看到如下的输出。

好吧,上述代码并没有完全利用面向对象程序的权限。由于上述代码的输出结果将不受您运行次数的影响而改变。您在类内部定义了静态变量,而这些变量的值将保持不变,即使您创建了无限多个新对象。总之,您不能期望它为您提供奔驰或法拉利汽车的详细信息。

Scala中的构造函数

构造函数主要用于初始化对象状态。对象初始化在对象创建时发生,并且只调用一次。

Scala中有两种类型的构造函数:主构造函数辅助构造函数。在本教程中,您将学习主构造函数(来源:O’Reilly)。

class Class_name(Parameter_list){ // 方法,属性 }

主构造函数包含与类相同的正文,并且它与类定义一起隐式创建。它从类定义开始,横跨类的整个主体。另外,当Scala程序中只有一个构造函数时,它被称为主构造函数。主构造函数可以定义零个、一个或多个参数。

以下是您提供的文本的简体中文翻译,保留了您的自定义分隔符:

所以,让我们以之前的例子为基础,但这次加入主要构造器的特性,并观察效果。

此外,这里您将了解到类的另一个特性,即一个类可以有多个对象或实例,但它们相互独立。

// 类的名称是 Car class Car(make: String, model: String, fuel: Int) { // 类方法 def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } object Main { // 主方法 def main(args: Array[String]) { // 多个类对象 var obj1 = new Car("BMW", "X7", 40); var obj2 = new Car("Mercedes Benz", "S350D", 50); obj1.Display(); obj2.Display(); } }

让我们快速看一下输出:

好吧,这不是很棒吗?借助构造器,您能够生成更有效的结果。

在 Scala 中声明对象

在 Scala 中声明对象也可以被称为实例化一个类或调用一个类。与类一样,对象也是面向对象编程的基本单元。

一个对象可以由三个特性组成(来源:极客邦

  • 状态:对象的属性代表它。它还反映了对象的属性。
  • 行为:对象的方法代表它。它还反映了对象与其他对象的响应。
  • 标识:它给对象一个唯一的名称,并使一个对象能够与其他对象交互。

将狗视为一个对象,并查看下图了解其身份、状态和行为。

(Source)

所有实例或对象共享类属性和方法。正如你在这里学到的,一个类可以有多个对象。然而,每个对象的状态或值是唯一的。

最后,你将编写一个包含主构造函数、类变量、属性和方法的代码,并将它们结合到一个代码中。

下面是类Motorcycle中各个组件组合在一起的图示。

下面的代码非常直观;从高层次上看,它检查摩托车引擎是on还是off。最初,引擎处于关闭状态,它会通知你它的状态并将其打开。

class Motorcycle(make:String,color:String) { var engineState: Boolean = false; def startEngine() { if (engineState == true){ println("The engine is already on."); } else { engineState = true println("The engine is now on."); } } def showAtts() { println("This motorcycle is a "+ color + " " + make); if (engineState == true){ println("The engine is on."); } else{ println("The engine is off."); } } } object Main { def main (args: Array[String]) { var m = new Motorcycle("BMW K 1600 GTL","White"); println("Calling showAtts..."); m.showAtts(); println("------"); println("Starting engine..."); m.startEngine(); println("------"); println("Calling showAtts..."); m.showAtts(); println("------"); println("Starting engine..."); m.startEngine(); } }

恭喜!

恭喜你完成本教程。

你现在知道如何在Scala中声明类和方法、实例化对象、设置它们的属性以及调用实例方法。这些概念不仅在Scala中有用,在其他编程语言中也会对你有所帮助。

面向对象的编程概念既有趣又非常强大。它为您的代码增加了新的维度,使其可重用。随着程序变得越来越大,您的代码复杂度也会增加。面向对象的编程概念中有很多精髓,比如继承、多态、实例方法等。另一个强大的特性是单例模式。设计原则可以帮助您的代码更加结构化和可读。关于设计模式的更多信息,可以考虑阅读这本书

如果您对这篇教程有任何问题,请随时在下面的评论部分提问。

最后,别忘了在DataCamp上参加新的Scala课程:Scala入门

Source:
https://www.datacamp.com/tutorial/scala-classes-objects