理论教育 深入理解抽象类和特质的区别与应用

深入理解抽象类和特质的区别与应用

时间:2023-06-14 理论教育 版权反馈
【摘要】:如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类称为抽象类。抽象类中可以包含具体的方法。只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

深入理解抽象类和特质的区别与应用

一、抽象类

在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类称为抽象类。

Scala 使用abstract 关键字定义抽象类,使用抽象类需要注意以下几点:

(1)抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

(2)抽象方法必须由子类来进行重写,子类在重写抽象属性和方法时不需要override 关键字。

(3)抽象类中可以包含具体的方法。

(4)只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

(5)子类中的抽象方法不能与父类的抽象方法同名。

运行结果为:(www.daowen.com)

D:\scalacode>scala Demo5.scala

Lucy:17

如果在抽象父类中,定义了字段,但是没有给出初始值,则此字段为抽象字段。抽象字段意味着,Scala 会根据自己的规则,为var 或val 类型的字段生成对应的getter 和setter 方法,子类必须以定义自己的具体字段并且覆盖抽象字段,不需要使用override 关键字。

abstract class Person{

二、特质(trait)

trait 类似于Java 中的interface,用于定义类的接口。trait 是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。trait 是抽象类的延伸,一个类可以同时实现多个trait,不管这些trait 之间有没有关系,所以trait 弥补了抽象类不能多重继承的缺陷。与Java 不同的是trait 可以定义属性和方法,继承trait 的类必须实现trait 所有未实现的属性和方法。类继承trait 后,必须实现其中的抽象方法,实现时不需要使用override 关键字。

trait 更多的是作为工具方法的容器,把通用的功能放在trait 中。一个子类,如果需要把很多通用的功能都混进来,那么就需要继承多个trait 父类,继承的第一个父类使用extends,后面的父类使用with。Scala 使用extends 关键字来继承trait,若已经使用了extends 则需使用with 关键字对trait 进行多重继承。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈