Предположим, у меня есть базовый класс
abstract class Base {
type B<: Base
def rep:String
def copy:B
}
class MyBase(override val rep:String) extends Base {
type B = MyBase
override def copy = new MyBase(rep)
}
Затем я пытаюсь добавить еще одну черту в качестве миксина, для которой я хочу, чтобы тип возвращаемого значения для копии был подходящим типом (то есть вызывающий экземпляр наmixin возвращает тип mixin, устанавливая B в соответствующий тип).Я не смог заставить его скомпилировать или даже понять, куда должно идти ключевое слово override.
Отредактировано: я уточнил пример
abstract class Base {
type B <: Base
def rep:String
def copy:B
}
class MyBase(val rep:String) extends Base {
type B = MyBase
def copy = new MyBase(rep)
}
trait DecBase extends Base {
abstract override def rep = "Rep: "+super.rep
}
Мой вопрос: какобъявить подходящий тип B и метод копирования для DecBase, чтобы копия возвращала DecBase, а также, почему эта компиляция не выполняется?
println(((new MyBase("ofer") with DecBase)).rep)
Это то, чего я бы достиг в Java (с некоторой скверностью, используя рекурсивные универсальные типы).Я уверен, что в Scala можно сделать что-то более приятное.
Редактировать
Используя
trait DecBase extends Base {
override type B = DecBase
abstract override val rep= "Dec:"+super.rep
abstract override def copy = new MyBase(rep) with DecBase
}
Я получаю следующие ошибки компилятора
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
println(((new MyBase("ofer") with DecBase)).rep)
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
abstract override def copy = new MyBase(rep) with DecBase