2016-04-10 7 views
2

クラスとそのコンパニオンオブジェクトの使用を正しく理解することに問題があります。ケースクラスとコンパニオンオブジェクト

ケースクラスを定義する際には、付属のコンパニオンオブジェクトがありますが、ケースクラスと同じ名前のオブジェクトを定義した結果はどうなりますか?コンパニオンオブジェクトをオーバーライドしますか?そして、ケースクラスのパラメータにアクセスする方法?多くの特別な意味を持っていないclass(またはtrait)とobject同じ名前を与える

case class TestCaseClass(att1: String, att2: Int, att4s: List[String]) 

object TestCaseClass { 

    def iWantDoSomethingWithMyParams: String = { 
    att1 + " " + att2 
    } 

    // Other functions 
} 

object AnotherTestCaseClass { 

    def iWantDoSomethingWithTestCaseClassParams: String = { 
    // How to access TestCaseClass.att1 
    TestCaseClass.att1 + " " + TestCaseClass.att2 
    } 

    def iWantGetAllAttr4: List[String] = { 
    // ??? 
    } 
} 
+0

http://stackoverflow.com/questions/5827510/how-to-override-apply-in-a-case-class-companion –

答えて

3

はTestCaseClass.scalaファイルの例では、私は次のように定義します。それは大部分が慣習の問題です。

コンパニオンオブジェクトは、ほかのオブジェクトと同様にシングルトンクラスです。コンパニオンオブジェクト内のメソッドがクラスのインスタンスとやりとりするようにするには、他の状況と同様にクラスのインスタンスを渡す必要があります。だから、あなたの最初の例を修正する:クラスやオブジェクトが別の名前空間に属しているため

case class TestCaseClass(att1: String, att2: Int, att4s: List[String]) 

object TestCaseClass {  
    def iWantDoSomethingWithMyParams(x: TestCaseClass): String = 
    x.att1 + " " + x.att2 
} 

クラスとオブジェクトは、どのような方法で互いのつま先にはない「オーバーライド」またはステップを実行します。クラス名は型レベル(およびコンストラクタ呼び出し)で使用され、オブジェクト名は用語レベルで使用されます。 - クラスのコンパニオンオブジェクトで定義された任意のimplictsは、自動的にスコープに持ち込まれ

  • それは暗黙が解決される方法に影響しない:言っ

    、クラスとその仲間の間でいくつかの関係があります。

  • privateオブジェクトはオブジェクトに表示され、その逆もあります。 case classが実際にクラスを定義するだけで、また、そのコンパニオンオブジェクトへapplyunapplyメソッドを追加し、簡略化したものですので、

  • ケースクラスは、少し異なっています。

+2

「それは同じのクラスに特別なアクセス権を持っていません。名前 "はい、そうです。クラスのプライベートメンバーにアクセスすることができます(そしてクラスはオブジェクトにアクセスできます)。 –

+0

@AlexeyRomanovありがとうございました。 –

+0

クラスとしてコンパニオンオブジェクトに名前を付ける意味がない場合、そのオブジェクトをコンパニオンオブジェクトにするのは何ですか?それが同じファイルに定義されているという事実? – Make42

関連する問題