2017-07-21 3 views
0

私は様々なステートレスな実装を持つ抽象スーパークラスを持っています。抽象スーパークラスをclassにして、各実装をobjectにすることが、私がそれぞれの必要があるためだと思います。スカラ "オブジェクト"をクラスインスタンスのように返すにはどうしたらいいですか?

これは、おもちゃの一例であるが、それは私が取得していますコンパイルエラーを示しています

// Tramsformer.scala 

class Transformer { 
    def transform(value : String) : String 
} 

object Transformer { 
    getTransformer(String : name) : Transformer = { 
    name match { 
     case "upper" => UpperTransformer 
         // I'm getting "Cannot Resolve Symbol" on UpperTransformer, 
         // even though they're in the same package. 
     case _ => throw new IllegalArgumentException("...") 
    } 
    } 
} 

// --- 
// UpperTransformer.scala is in the same package 
object UpperTransformer extends Transformer { 
    override def transform(vlaue : String) = foo.toUpperCase() 
} 

私は本当にここ(のdataProvider、desiredAction)上の動的ディスパッチのいくつかの並べ替えのために撮影しています。

次に、不要なオブジェクトを作成せずにTransformer.getTransformer("upper").transform("stack-overflow")を呼び出すクラスもあります。

私は別のやり方を考えていますか?早すぎる最適化について心配するのを止め、インスタンスを愛することを学ぶべきですか?

答えて

2

問題は可視性ではなく、単にUpperTransformerという名前のオブジェクトは定義しないでください。クラスは1つだけです。 class UpperTransformerobject UpperTransformerに置き換えると、コードが正常に動作するはずです。

+0

おっと、私の質問でタイプミス。それはすでに「オブジェクト」です。 –

+0

@EdBrannin他のタイプミス(Transformerクラスの 'abstract'が' value'と 'foo'、' String:name')を修正した後、あなたが投稿したコードは 'クラス '。したがって、実際の問題が何であるかを再考する必要があります(また、再現可能なコンパイル可能なコードサンプルが実際に問題をコンパイルして再現することを確認してください)。 – sepp2k

+0

ダーン、申し訳ありません。私は今日後で既存のコードを修正することでそれをリメイクします。 –

関連する問題