Scala中子类的简单练习
我对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()”的方法
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
的实例,并且使用classC
中的hello
方法,不是classA
中的对象,因为您的引用A:A已经引用了对象c:c,所以A.hello或c.hello类似