其他分享
首页 > 其他分享> > scala面向对象基础---类继承和特质

scala面向对象基础---类继承和特质

作者:互联网

一、类继承

传送门Scala基础—类继承

  1. Scala的类继承
  2. 调用超类的构造方法
  3. 重写超类的成员
    3.1.不被继承的成员
    3.2.不可重写的成员
    3.3.无参方法与字段
  4. 子类型多态与动态绑定
  5. 抽象类
  6. 关于多重继承
  7. Scala类的层次结构

二、特质介绍

因为Scala没有多重继承,为了提高代码复用率提出了特质的概念,在定义上它主要有以下几个特点(结合单例对象):

在混入特质时它有以下几个特点:

	class MyClass{
      val c = "Alex"
      val print = () => println(c)
    }


    trait A {
      val absA : String
      private val a = "Trait A"
    }

    trait B {
      val b = "Trait B"
    }
   
    class sub extends MyClass with A with B{
      val absA = "absA"//抽象成员加不加override都可以重写

      override val a = "wzx"//出错,私有成员访问不到

      val myprint = () => println(b,c)
    }

再看一下几种错误的写法!!!
在这里插入图片描述

三、特质的层次

不过混入特质时有一个限制条件:那就是要混入该特质的类/单例对象/特质,它的超类必须是待混入特质的超类,或者是待混入特质的超类的子类。因为特质是多重继承的替代品,那就有“继承”的意思。既然是继承,混入特质的类/单例对象/特质的层次,就必须比待混入特质的层次要低。例如:

scala> class A
defined class A

scala> class B extends A
defined class B

scala> class C
defined class C

scala> trait D extends A
defined trait D

scala> trait E extends B
defined trait E

scala> class Test1 extends D
defined class Test1

scala> class Test2 extends A with D
defined class Test2

scala> class Test3 extends B with D
defined class Test3

scala> class Test4 extends C with D
<console>:13: error: illegal inheritance; superclass C
 is not a subclass of the superclass A
 of the mixin trait D
       class Test4 extends C with D
                                  ^

scala> class Test5 extends A with E
<console>:13: error: illegal inheritance; superclass A
 is not a subclass of the superclass B
 of the mixin trait E
       class Test5 extends A with E

四、混入特质的简便方法

如果想快速构造一个混入某些特质的实例,可以使用如下语法:

new Trait1 with Trait2 ... { definition }

这其实是定义了一个匿名类,这个匿名类混入了这些特质,并且花括号内是该匿名类的定义。然后使用new构造了这个匿名类的一个对象,其等效的代码就是:

class AnonymousClass extends Trait1 with Trait2 ... { definition }

new AnonymousClass

除此之外,还可以在最前面加上一个想要继承的超类:

new SuperClass with Trait1 with Trait2 ... { definition }

四、子类型

一个类或者单例对象,如果混入了一个特质(extends和with都行),那么它们就是该特质的子类型。凡是需要特质的地方,都可以由该特质的子类型来替换。

import scala.collection.mutable.ArrayBuffer

trait Pet {
	val name: String
}
class animal

object Dog extends  Pet {
	val name: String = "Harry"
}
class Cat(val name: String) extends animal with Pet

val cat = new Cat("Sally")

val animals = ArrayBuffer.empty[Pet]
animals.append(Dog)
animals.append(cat)
animals.foreach(pet => println(pet.name))  // Prints Harry Sally

标签:特质,混入,scala,trait,---,面向对象,extends,超类,class
来源: https://blog.csdn.net/qq_39507748/article/details/119144579