Вы можете использовать черту реализации, как это делают классы коллекции, которая параметризована конкретным типом. Например, что-то вроде:
но я создал неизменяемый класс, поддерживающий такие операции, как +, - и т. Д., Который возвращает новый экземпляр этого класса при его изменении.
Я хотел создать подкласс этого класса, чтобы добавить немного состояния и функциональности, но теперь я столкнулся с проблемой, заключающейся в том, что все методы исходного класса возвращают экземпляры самого себя, а не подкласса.
Основываясь на моих текущих ограниченных знаниях Scala, я могу придумать это:
class Foo(val bar:Int) {
def copy(newBar:Int) = new Foo(newBar)
def + (other:Foo):This = copy(this.bar + other.bar)
}
class Subclass(barbar:Int) extends Foo(barbar) {
override def copy(newBar:Int) = new Subclass(newBar)
override def + (other:Subclass) = super.+(other).asInstanceOf[Subclass]
}
Проблема здесь совершенно очевидна - все операции суперкласса, которые возвращают новый экземпляр, должны быть переопределены в подклассе с помощью приведения.
Сначала «this.type» казался многообещающим, но «this.type» включает в себя только «this», а не любой другой объект того же типа.
Существует ли стандартная схема, позволяющая сделать неизменяемые классы легко подклассами? Что-то вроде:
class Foo(val bar:Int) {
def copy(newBar:Int):SameType = new Foo(newBar)
def + (other:Foo) = copy(this.bar + other.bar)
}
class Subclass(barbar:Int) extends Foo(barbar) {
override def copy(newBar:Int):SameType = new Subclass(newBar)
override def + (other:Subclass) = super.+(other).asInstanceOf[Subclass]
}
Этот конкретный подход потребовал бы, чтобы компилятор требовал, чтобы все подклассы реализовывали метод copy (), который возвращает тот же тип, что и этот подкласс, что было бы прекрасно для меня. Тем не менее, я не думаю, что такая вещь существует в Scala в настоящее время.
Некоторые обходные пути, которые приходят на ум:
Использовать делегирование - но, конечно, я бы все же повторно реализовал все методы как вызовы делегатов.Используйте неявные типы для добавления операций вместо подклассовИспользуйте изменяемую структуру данных. Возможно, это самое простое и быстрое решение, но я бы потерял преимущества использования неизменяемых структур данных (о которых я все еще надеюсь узнать больше).Я уверен, что это уже обсуждалось много раз, и я прошу прощения за повторный запрос. Я сделал Google для дублирующего вопроса без успеха, поэтому мои поисковые термины были неправильно составлены.
Заранее спасибо,
DOBES