我在两个方面的队列示例上有点混淆:
问题1:为什么BasicIntQueue的方法没有override关键字.
这是示例代码:
abstract class IntQueue {
def get(): Int
def put(x: Int)
}
import scala.collection.mutable.ArrayBuffer
class BasicIntQueue extends IntQueue {
private val buf = new ArrayBuffer[Int]
def get() = buf.remove()
def put(x: Int) { buf += x }
}
Run Code Online (Sandbox Code Playgroud)
不应该是:
//class BasicIntQueue ...
override def get() = buf.remove()
override def put(x: Int) { buf += x }
Run Code Online (Sandbox Code Playgroud)
我用覆盖实现了,预期结果是一样的.
问题2:为什么超级特质?
trait Doubling extends IntQueue {
abstract override def put(x: Int) { super.put(2 * x) }
}
class MyQueue extends BasicIntQueue with Doubling
Run Code Online (Sandbox Code Playgroud)
我已经尝试过没有super关键字而且失败了.我绘制了一个UML图,但有一些模糊推理原因.
abstract override def put(x: Int) { super.put(2 * x) }
Run Code Online (Sandbox Code Playgroud)
这行倍增方法会覆盖BasicInQueue的方法吗?如果是这样,为什么我们需要超级?我们为什么不能这样做:
abstract override def put(x: Int) { 2 * x }
Run Code Online (Sandbox Code Playgroud)
对我来说,上面的行只会用新的put实现覆盖BasicInQueue的方法?抽象覆盖关键字只适用于运行时的某种堆栈操作吗?为什么我们还需要超级?什么是超级指的?无论左边是什么?那么BasicIntQueue with Doubling,加倍的超级关键字是指BasicIntQueue吗?
感谢您的时间.
对于问题1,IntQueue被声明为抽象,方法是虚拟的.因此,BasicIntQueue不是重写方法,而是提供所需的实现.如果IntQueue中的方法有主体,那么BasicIntQueue在其方法上需要override关键字.
对于问题2,super指的是特征方法重写的方法.该特征要求该类定义了一个put方法,但不是完全替换它,而是通过将发送给它的值加倍来增加它.
abstract override def put(x: Int) { 2 * x }
Run Code Online (Sandbox Code Playgroud)
将无法正常工作,因为它实际上没有在队列中放置任何东西,事实上因为函数是单位(什么都不返回)它根本不做任何事情.
abstract override def put(x: Int) { super.put(2 * x) }
Run Code Online (Sandbox Code Playgroud)
获取发送的值,将其put加倍,然后调用原始put方法将其实际添加到队列中.