2.3

继承 inheritance

特质(trait)是定义行为、状态的抽象,类似java中的interface,但语义、功能更丰富。

尽管特质比java interface语义丰富很多,但暂且把使得一个类具备一个特质的行为称为一个类++实现++了一个特质。

类型只能继承一个class,不存在多继承,但类似java,可实现任意个特质(trait)。(class xx extends X with T1 with T2 ...)

类型继承类、实现特质的语法形式并非是extends关键字用于继承class、with关键字用于trait,类声明如果有继承/实现,则首先是extends关键字接其他类或特质,而后是多个"with TraitXx",不能只有with而没有extends(如果有覆盖早定义则extends接的是覆盖内容而with接的是类)。

final修饰class表示类不可被继承,sealed修饰class表示类不可在类定义源文件外被继承。final可修饰字段,表示字段不可被重写(不同于java中的final字段指不可被重新赋值)。

无函数实现体的方法即为抽象方法,有抽象方法的类必须声明为abstract class。抽象的val/var“字段”会生成抽象的getter/setter类方法(var同时包括getter&setter),不会生成类字段。

覆盖父类非抽象方法必须添加override关键字,实现父类抽象方法或特质中的方法则无需override关键字。

子类中使用super关键字引用父类。

scala中不能像java中那样调用super(...)。

一个override def只能覆盖父类的def;一个override val可覆盖父类的val和def;一个override var只能覆盖父类abstract var(或者一对getter/setter的def)。

匿名子类:

class P(val name:String)

object app extends App {
    val x= new P("Lei Jun") {
        def greeting = "are you ok"
    }
    
    // anonymous subclass as parameter
    def hello(p:P{def greeting:String})= println(s"${p.name}: ${p.greeting}")
}
posted @   秋渡晚枫  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示