Ich entwerfe eine einfache Datenverarbeitungspipeline in Scala. Es handelt sich um PipelineStage
, die transform
einige StageOutput
in eine andere StageOutput
. A Pipeline
ist ein Wrapper für eine Sequenz von PipelineStage
, die generisch auf alle ihre transform
Methoden zugreifen müssen.Scala - Implementieren eines polymorphen abstrakten Merkmals ohne Polymorphismus
Allerdings habe ich Probleme, da beide Lösungen, die ich mir ausgedacht habe, grundsätzlich nicht funktionieren ... der erste beruht auf einer abstrakten polymorphen Methode, die nicht-polymorph implementiert ist (nicht kompiliert) und die zweite beruht auf der Fähigkeit, eine Seq[AbstractTrait]
zu verwenden, wobei die AbstractTrait
polymorph ist, was wiederum für den Compiler bedeutungslos ist. Siehe unten ...
Szenario 1. Machen Sie die transform
Methode polymorph.
abstract trait PipelineStage {
def transform[A <: StageOutput, B <: StageOutput](in: A): B
}
class PipelineStage2 extends PipelineStage {
def transform(in: StageOutput1): StageOutput2
}
class Pipeline {
def stages: Seq[PipelineStage]
}
Hier die Pipeline
hat keine Probleme kompilieren, aber die Stufen nicht, da die Unterschrift ihrer transform
Methoden, während sie ‚Respekt‘ der abstrakten Unterschrift des Polymorphismus kompilieren, sind eigentlich nicht selbst polymorph also nicht so weit wie der Compiler betrifft.
Szenario 2. Machen Sie das Merkmal PipelineStage
selbst polymorph.
abstract trait PipelineStage[A <: StageOutput, B <: StageOutput] {
def transform(in: A): B
}
class PipelineStage2 extends PipelineStage[StageOutput1, StageOutput2] {
def transform(in: StageOutput1): StageOutput2
}
class Pipeline {
def stages: Seq[PipelineStage]
}
Dies löst das Problem für die PipelineStage
s, haben sie keine Probleme kompilieren, und ihre Methoden verwandeln arbeiten an ihrer eigenen Ordnung. Sie sind jedoch nicht technisch die gleiche Eigenschaft implementieren jetzt, so Pipeline
nicht kompilieren, da Seq[PipelineStage]
sinnlos ist jetzt ...
Gibt es ein etabliertes Muster entweder für die Umsetzung polymorphe abstrakte Methoden ohne den Polymorphismus oder Verweisen auf eine Sequenz von Klassen, die dieselbe abstrakte polymorphe Eigenschaft implementieren? Mein Gefühl ist nein und das habe ich wahrscheinlich falsch angegangen, aber vielleicht gibt es einen syntaktischen Trick, den ich irgendwo auf der Linie vermisse. Vielen Dank.
Versuchen Sie, den Körper der 'Pipeline'-Methode auszufüllen, vorausgesetzt, Sie haben es irgendwie kompiliert und haben Zugriff auf' def stages: Seq [PipelineStage] '. Zeigen Sie an, wie genau Sie diese Funktion verwenden möchten. – Dima