Я запутался в примере очереди с двумя вещами:
Вопрос 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 }
}
Не должно ли быть:
//class BasicIntQueue ...
override def get() = buf.remove()
override def put(x: Int) { buf += x }
Я реализовал с переопределением, и ожидаемый результат тот же.
Вопрос 2: Почему супер в чертах?
trait Doubling extends IntQueue {
abstract override def put(x: Int) { super.put(2 * x) }
}
class MyQueue extends BasicIntQueue with Doubling
Я пробовал это без супер ключевого слова, и это не удалось. Я нарисовал диаграмму UML, но у меня есть нечеткое объяснение, почему.
abstract override def put(x: Int) { super.put(2 * x) }
Эта строка метода удвоения переопределяет метод BasicInQueue? Если так, то зачем нам супер? Почему мы не можем просто сделать:
abstract override def put(x: Int) { 2 * x }
Для меня приведенная выше строка просто переопределит метод BasicInQueue с новой реализацией put? Ключевое слово abstract override предназначено только для манипуляций со стеком во время выполнения, верно? Зачем нам супер все равно? На что ссылается супер? Что бы это ни было слева? Так что с BasicIntQueue with Doubling
, является ли ключевое слово super в Doubling ссылкой на BasicIntQueue?
Спасибо, что уделили время.