Ho una classe di base astratta (Base
) che ha alcuni tratti di stack definiti per esso (StackingTrait
).Scala: mixin trait con classe base astratta
trait Base {
def foo
}
trait StackingTrait extends Base {
abstract override def foo { super.foo }
}
Sarebbe molto conveniente per implementare una sottoclasse utilizzando la seguente sintassi, ma questo non funziona perché il compilatore dice che foo deve essere dichiarato con override
e poi con abstract override
sulla ricompilazione, che non è valido perché Impl
è una classe.
class Impl extends Base with StackingTrait {
def foo {}
}
Non riesco a pensare a una buona ragione per cui tale sintassi non sia consentita; foo è definito logicamente con in modo che l'ordine di sovrapposizione si verifichi concettualmente nello stesso modo.
Nota: Ho trovato questa soluzione alternativa che farà effettivamente la stessa cosa che voglio, ma la necessità di una classe di supporto mi fa desiderare una soluzione migliore.
class ImplHelper extends Base {
def foo {}
}
class Impl extends ImplHelper with StackingTrait
Perché la sintassi desiderata non viene compilata ed esiste una soluzione elegante?
Ottima risposta! Stavo per pubblicare una domanda su questo stesso scenario. Grazie! –
Ho già riscontrato questo problema. La linearizzazione alla fine ha ragione su questo, ma ho capito che lo scopo reale del raggruppamento dei caratteri è questo: puoi apportare una modifica con una caratteristica di impilamento solo a un'implementazione concreta esistente della comune classe/tratto astratti. Vale a dire. avere un 'abstract class List' e un' Trait Mod extends List'. Non puoi semplicemente scrivere 'classe Foo estende List con Mod'. Innanzitutto, devi avere una lista concreta, come 'classe LinkedList estende List', quindi puoi scrivere' class Bar estende LinkedList con Mod'. Spero che abbia un senso. –
Ho dimenticato di aggiungere che questo riguarda solo i tratti con metodi di "override astratto", per essere chiari. Senza tali metodi sembra che i tratti possano essere mescolati liberamente. –