Scala中子类的简单练习

Scala中子类的简单练习,scala,subclass,extends,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()”的方法

我对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()”?

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

Scala REPL
类型
之间存在差异。当你说

class A {...}
class B extends A {...}
val b = new B
val a: A = b
您可以定义类型
a
和类
a
。当你说

class A {...}
class B extends A {...}
val b = new B
val a: A = b
您可以使用类型
B
定义一个新类
B
。但至关重要的是,
B
类型是
a
类型的一个子类型,因此您可以在任何可以使用
a
类型的值的地方使用
B
类型的值

当你说

class A {...}
class B extends A {...}
val b = new B
val a: A = b
创建类
B
的新实例,并将引用放在
B
中。
b
的类型是
b
的类型

当你说

class A {...}
class B extends A {...}
val b = new B
val a: A = b
您将
a
作为类
B
的同一实例的引用,但您告诉它将其视为
a
的类型。这是可以的,因为
B
a
的子类,子类继承其父类的类型

由于
a
引用了
B
的一个实例,当您像这样调用
hello
方法时

a.hello()
它将调用为类
B
的对象定义的
hello
方法,因为这是
a
中保存的


因此,即使
a
的类型是
a
,它引用的值实际上是
B
类型,因为它是类
B
的实例。在您的示例中,还有另一个继承级别,但同样的原则也适用:您可以将类
C
的实例分配给类型
a
的引用,但它仍然是类
C
的实例,并且使用class
C
中的
hello
方法,不是class
A

中的对象,因为您的引用A:A已经引用了对象c:c,所以A.hello或c.hello类似