Я реализую некоторый код в Scala, следуя инструкциям на Java.
В руководстве есть фрагмент кода, который можно свернуть следующим образом:
public abstract class A {
private int id;
public A(String name) {
id = Helper.getId(name);
fetchAllAttributes();
}
protected abstract void fetchAllAttributes();
protected int fetchAttribute(String attribute) {
Helper.getAttribute(id, attribute);
}
public class B extends A {
int volume;
public B() {
super("B");
}
@Override
protected void fetchAllAttributes() {
volume = super.fetchAttribute("volume");
}
}
}
И этоВот как это выглядит, когда вы переводите его в Scala:
abstract class A(val name: String) {
private val id = Helper.getId(name)
fetchAllAttributes()
protected def fetchAllAttributes(): Unit
protected def fetchAttribute(attribute: String): Int = {
Helper.getAttribute(id, attribute)
}
class B() extends A("B") {
var volume = 0
override protected def fetchAllAttributes(): Unit = {
volume = super.fetchAttribute("volume")
}
}
}
И здесь я хотел бы задать два вопроса:
- Есть ли название для этого шаблона, гдеВы вызываете абстрактный метод в конструкторе абстрактного класса и предоставляете метод для использования дочерними классами в их реализации?
- Как разработчик Scala, мне действительно не нравятся изменяемые объекты и переменные.Есть ли хороший способ реализовать это неизменным образом, используя только
val
s?