Scala中子类的简单练习

时间:2018-06-19 16:32:13

标签: scala subclass extends

我对Scala和子类有一个简单的疑问。

我有这些课程:

class A {
  def hello() = println("hello from A")
}

class B extends A {
  override def hello() = println("hello from B")
}

class C extends A {
  override def hello() = println("hello from C")
}

现在,在这三个类中,有一个名为“ hello()”的方法

我有一个对象:c:C

我执行:a:A = c

现在如何通过对象a调用C的方法“ hello()”?

2 个答案:

答案 0 :(得分:0)

是的,正在调用C实例hello方法。

Scala REPL

scala> class A {
     |   def hello() = println("hello from A")
     | }
defined class A

scala>

scala> class B extends A {
     |   override def hello() = println("hello from B")
     | }
defined class B

scala>

scala> class C extends A {
     |   override def hello() = println("hello from C")
     | }
defined class C

scala> val a: A = new C
a: A = C@764fffa0


scala> a.hello
hello from C

答案 1 :(得分:0)

typeclass之间是有区别的。当你说

class A {...}

您同时定义了类型A和类A。当你说

class B extends A {...}

您定义类型为B的新类B。但至关重要的是,B的类型是A类型的子类型,因此您可以在任何可以使用B类型的值的地方使用A类型的值

当你说

val b = new B

您将创建类B的新实例,并将引用放入b中。 b的类型就是B的类型。

当你说

val a: A = b

您将a引用为类B的相同实例,但您告诉它将其视为类型为A。之所以可以,是因为BA的子类,并且子类继承了其父类的类型。

由于a指的是B的实例,因此当您像这样调用hello方法时

a.hello()

它将调用为类hello的对象定义的B方法,因为这是a中保留的内容。

因此,即使a type A,它引用的 value 实际上也是B类型,因为它是类B的实例。在您的示例中,继承有另一个层次,但适用相同的原理:您可以将类C的实例分配给类型A的引用,但仍将是类{{ 1}},并且具有类C中的hello方法,而不是类C中的方法。