[读书日志]从零开始学习Chisel 第五篇:Scala面向对象编程——类继承(敏捷硬件开发语言Chisel与数字系统设计)

ops/2025/1/12 12:14:24/
3.3类继承
3.3.1Scala中的类继承

为了节省代码量和反映实际各种类之间的联系,通常采取两种策略,包含和继承。包含是说明一个类中包含另一个类的对象,但两者之间没有必然联系。继承是从一个宽泛的类派生出更具体的类的过程,

被继承的类称为“超类”或“父类”,而派生出来的类称为“子类”,如果继承层次较深,最顶层的类通常也叫“基类”。通过在类的参数列表后面加上关键字extends和被继承类的类名,就完成了继承的过程。

scala">scala> class A {| val a = "Class A"| }
// defined class Ascala> class B extends A {| val b = "Class B inherits from A"| }
// defined class Bscala> val x = new B
val x: B = B@611587f7scala> x.a
val res0: String = Class Ascala> x.b
val res1: String = Class B inherits from A
3.3.2调用超类的构造方法

在以上的例子中,A没有参数,当A有参数时B应该如何调用呢?在构造某个类的对象时,应该先构建超类对象的组件,再构造子类的其他组件。也就是说,类B应当调用类A的构造方法。语法是:

class 子类(子类对外接收的参数) extends 超类(子类给超类的参数)

Scala只允许主构造方法调用超类的构造方法。示例如下:

scala">scala> class A(val a: Int)
// defined class Ascala> class B(giveA:Int, val b : Int) extends A(giveA)
// defined class Bscala> val x = new B(10,20)
val x: B = B@7fd3fd06scala> x.a
val res2: Int = 10scala> x.b
val res3: Int = 20scala> x.giveA
-- [E173] Reference Error: ---------------------------------------------------------------------------------------------
1 |x.giveA|^^^^^^^|value giveA cannot be accessed as a member of (x : B) from object rs$line$15.|  private value giveA can only be accessed from class B.
1 error found
3.3.3重写超类的成员

不被继承的成员

一般情况下,超类的成员都会被子类继承,但有两种不会被继承,一是超类中用private修饰的私有成员,二是被子类重写的成员。重写超类的成员时,应该再定义的开头加上关键字override。之前的toString函数就是使用这种方法重写的。

不可重写的成员

如果超类成员在开头用关键字final修饰,则子类只能继承,不能重写。使用final修饰class,则这个类禁止被其他类继承。

无参方法与字段

无参方法在调用时可以省略空括号,因此对于用户代码而言,调用无参方法和调用同名字段没有什么不同,Scala允许超类的无参方法被子类重写为字段,但是字段不能反过来被重写为方法,而且方法返回的类型必须与字段的类型一致。

字段与方法的区别在于,字段一旦被初始化,就会被保存在内存中,以后每次调用都只需要读取内存,而方法不会占用内存空间,但每次调用都需要执行一遍程序段,速度更慢。

Scala只有两种命名空间,值——字段、方法、包、单例对象;类型——类、特质

因为字段和方法同处一个命名空间,所以字段可以重写无参方法。在同一个域中不允许同时出现同名的字段、无参方法和单例对象。

3.3.4子类型多态与动态绑定

类型为超类的变量可以指向子类的对象,称为子类型多态。但是对于方法而言,尽管变量的类型是超类,但方法的版本是动态绑定的。调用的方法要允许哪个版本,是由变量指向的对象来决定的。

scala">scala> class A {| def display() = "I'm A."| }
// defined class Ascala> class B extends A {| override def display() = "I'm B."| }
// defined class Bscala> val x: A = new B
val x: A = B@1fd35a92scala> x.display()
val res4: String = I'm B.

上面的程序中,声明了一个类型为A的变量,创建B的对象赋值给它,它调用方法时调用的是B类的方法。

3.3.5抽象类

如果类中包含没有初始化的字段或没有函数体的方法,那么这个类是抽象类,必须用abstract修饰。抽象类无法通过new来构造实例对象。抽象类确实的成员定义,可以由抽象类的子类补充,即抽象类声明了抽象成员,但没有定义。如果子类补全了相关定义,称子类“实现”了超类的抽象成员。此时override可写可不写。

scala">scala> abstract class A {| val a: Int| }
// defined class Ascala> class B(val b: Int) extends A {| val a = b * 2| }
// defined class Bscala> val y = new B(1)
val y: B = B@58486debscala> y.a
val res5: Int = 2scala> y.b
val res6: Int = 1

抽象类常用于定义基类,基类会派生出很多不同的子类,基类只需要声明公共成员,让子类实现它们各自期望的版本。

3.3.6多重继承

Scala没有多重继承,这让一些特性变得非常简洁。Scala设计了“特质”来实现相同的功能,并且它的规则更加简单明了。

3.3.7Scala类的层次结构

Scala所有的类,包括已有的类和自定义的类,都不是毫无关联的,如下图所示,箭头表示属于指向的类的子类:
在这里插入图片描述
最顶部的是抽象类Any,它是所有类的超类。
在这里插入图片描述
Any有两个子类,即AnyValAnyRef,所有类被分为两大部分,值类和引用类。值类之间存在隐式转换,就是从Byte到Doubel的转换。除了9个值类,也可以自定义值类,但必须显式继承自AnyVal,否则都认为是AnyRef的子类。

另外,Nothing是所有类的子类,表示空值或空引用。Null类是空引用,Scala中可以把各种类型打包成一个特殊的可选值,为了表示空,没有这个特殊的概念,以及兼容各种自定义、非自定义的值和引用类,所以这个特殊的可选值就是把Nothing类进行打包。


http://www.ppmy.cn/ops/149116.html

相关文章

Django管理后台实现ECS服务管理:权限控制与重启功能

1. 引言 在现代Web应用开发中,管理ECS(Elastic Container Service)服务是一项常见且重要的运维任务。本文将详细介绍如何在Django管理后台中创建一个自定义的ECS服务管理界面,实现精细的权限控制和服务重启功能。我们将特别关注如何根据用户角色和服务特性来限制操作权限,…

西门子1200 ModbusTCP通信(服务器)

一、创建项目并设置PLC参数 二、添加数据块和参数 相关参数设置如下: 参数说明InterfaceId网口硬件标识符,对于本体网口为 64,即16#40。ID连接 ID,取值范围 1~4095Connection Type连接类型。TCP 连接默认为:16#0BAct…

单例模式5种写法

单例模式是设计模式中最简单的一种,其目的是确保一个类只有一个实例,并提供一个全局访问点。以下是单例模式的五种常见写法: ### 一、懒汉式(线程不安全) java public class Singleton { private static Singlet…

[读书日志]从零开始学习Chisel 第六篇:Scala面向对象编程——特质(敏捷硬件开发语言Chisel与数字系统设计)

3.4特质 3.4.1什么是特质 特质使用trait开头,它与单例对象很像,两者都不能有输入参数,但单例对象是具体的,特质是抽象的。两者都不能用new实例化,类,单例对象,特质三者内部都可以包含字段和方…

14:00面试,15:00就出来了,问的问题过于变态了。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到2月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

(超详细)Maven安装配置、以及在IDEA中创建Maven项目

一、登录官网下载Maven Download Apache Maven – Maven 根据自己所需要进行下载,如果是windows系统就下载zip文件,Linux系统就下载gz文件 我下载的版本是3.6.3,下面是网盘链接: 百度网盘链接: https://pan.baidu.com/s/1Ytoprb…

算法面试1

简述yolov1的网络架构 YOLOv1网络结构包括24层卷积层用来提取图像的特征,2层全连接层回归得到7730(141420)的张量。   网络结构大概如下:输入的是4484483通道的图像,就是RGB图像,然后用64个卷积核大小是…

Clojure语言的多线程编程

Clojure语言的多线程编程 在现代软件开发中,多线程编程是一项重要的技能。它使程序能够在同一时间执行多个任务,充分利用多核处理器的性能。在众多编程语言中,Clojure作为一门函数式编程语言,提供了强大的并发支持。本文将深入探…