我对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()”?
答案 0 :(得分:0)
是的,正在调用C
实例hello方法。
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)
type
和class
之间是有区别的。当你说
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
。之所以可以,是因为B
是A
的子类,并且子类继承了其父类的类型。
由于a
指的是B
的实例,因此当您像这样调用hello
方法时
a.hello()
它将调用为类hello
的对象定义的B
方法,因为这是a
中保留的内容。
因此,即使a
的 type 是A
,它引用的 value 实际上也是B
类型,因为它是类B
的实例。在您的示例中,继承有另一个层次,但适用相同的原理:您可以将类C
的实例分配给类型A
的引用,但仍将是类{{ 1}},并且具有类C
中的hello
方法,而不是类C
中的方法。