Как вы и предполагали, вам нужны абстрактные типы или общие параметры. Требуется ли, чтобы MyDataStructure не было чертой или абстрактным классом? Следующее определяет MyDataStructure как абстрактный класс, но вы также можете сделать его характерным признаком.
abstract class MyDataStructure {
type T
def myClone: T
}
class MyDataStructureExtended(foo: String) extends MyDataStructure {
type T = MyDataStructureExtended
def myClone = new MyDataStructureExtended(foo)
}
Результаты интерпретатора Scala показывают, что метод myClone, определенный в MyDataStructureExtended, является правильным типом.
scala> val mde = new MyDataStructureExtended("foo")
val mde = new MyDataStructureExtended("foo")
mde: MyDataStructureExtended = MyDataStructureExtended@3ff5d699
scala> val cloned = mde.myClone
val cloned = mde.myClone
cloned: MyDataStructureExtended = MyDataStructureExtended@2e1ed620
Возможно, вы захотите ограничить T так, чтобы его тип мог соответствовать только типу подклассов MyDataStructure
abstract class MyDataStructure {
type T <: MyDataStructure
def myClone: T
}
Я не знаю ваших требований, но я полагаю, что Scala 2.8 будет иметь некоторые хорошие функциональные возможности с классами case и именованными аргументами, которые позволяют клонировать классы case с методом copy.