私はScalaで単純なデータ処理パイプラインを設計しています。これは、PipelineStage
のものであり、transform
、StageOutput
、StageOutput
などです。 Pipeline
は、transform
メソッドのすべてに一般的にアクセスする必要があるPipelineStage
のシーケンスのラッパーです。Scala - ポリモーフィズムのない多形抽象的特徴の実装
しかし、私は両方の解決策として根本的にうまくいきませんでした...最初は抽象的な多態性メソッドが非多態的な方法で実装されています(コンパイルされません)。 2番目はAbstractTrait
が多形であるところのSeq[AbstractTrait]
を使用できることに依存しています。これはやはりコンパイラにとって無意味です。以下を参照してください。
シナリオ1. transform
メソッドを多相にします。ここで
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]
}
Pipeline
はコンパイル支障はありませんが、ステージは、彼ら「尊敬」抽象署名の多型ながら、実際にはそうではないん自分自身をポリモーフィックされていない、彼らのtransform
メソッドのシグネチャので、コンパイルされませんコンパイラが関係する限り一致します。
シナリオ2 PipelineStage
形質自体を多型にします。
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]
}
これはPipelineStage
秒間問題を解決し、彼らは何の問題コンパイルを持っていない、と彼らの変換方法は、自分で細かい作業します。しかし、彼らは技術的にSeq[PipelineStage]
は今無意味であるので、そのPipeline
がコンパイルされません、今と同じ形質を実装していない...
は、多型なしで多型の抽象メソッドを実装する、またはシーケンスを参照のどちらかのために設立されたパターンがあります同じ抽象多型性を実装するクラス私の気持ちはノーで、おそらく私は間違った方法でこれに接近してきただろうが、恐らく私はどこかで行方不明になっている構文上のトリックがある。ありがとう。
何らかの方法でコンパイルしたと仮定して、 'Pipeline'メソッドの本体を埋めて、' def stages:Seq [PipelineStage] 'にアクセスしてみてください。 その機能の使用方法を正確に表示します。 – Dima