0

拡張せずに、あるクラスから別のクラスに一連のメソッドをインポートしようとしています。私はそれを機能させましたが、なぜ一方のアプローチが機能し、もう一方のアプローチが機能しないのかは私にはわかりません。

剥ぎ取られて、これが私がやろうとしていることです

class A {def x() {println("x")}}
object A

class B {
   import A._
   def y() {x()}
}

そしてコンパイラは私に「見つかりません:値x」と言います

しかし、これを行うと機能します

class C extends A

class B {
   import C._

または私がこれを行う場合

object C extends A

class B {
   import C._

誰かがなぜこれが当てはまるのか説明できますか?

4

2 に答える 2

3

コード例が機能しない理由class C extends Aは、定義されているクラスにのみ存在できるクラス メンバーをインポートするためです。

一方、書くobject C extends Aときは、インスタンスを表し、そのメンバーをインポートできるシングルトン (Scala ではキーワードのように object と呼ばれます) を作成します。

したがって、他のクラスのメンバーを表示するには、オブジェクトまたは別のクラス/特性によって、常にそれらを拡張する必要があります。コンパニオン クラスのインスタンスを保持していないため、クラスのコンパニオン オブジェクトを宣言するだけでは不十分です。

于 2012-06-15T15:57:31.873 に答える
0

暗黙を使用する可能性もあります。

B のインスタンスから目的の A のインスタンスに到達する方法が必要です。以下の例ではメンバー値を使用していますが、関数にすることも可能です。

公開された特性は、B の this を A で宣言された暗黙に公開します。特性 PathTo を使用して、A の目的のインスタンスへのパスを公開できます。

class A {
  def a1(){ println("a1") };
  def a2(){ println("a2") };
  def a3(){ println("a3") };
}
object A{
    def a1()(implicit a:A){a.a1};
    def a2()(implicit a:A){a.a2};
    def a3()(implicit a:A){a.a3};

    //makes it possible to use a1() instead of a1()(this.a)
    implicit def insertPathToA(implicit path:PathTo[A]):A=path.pathTo;

    // Makes it possible to write this.a2() instead of this.a.a2();
    implicit def convertPathToA(path:PathTo[A]):A=path.pathTo;
};

trait exposed[U]{
    implicit def self:U=this.asInstanceOf[U];
}

trait PathTo[U]{
    implicit def pathTo:U;
}

class B(val a:A) extends exposed[B] with PathTo[A] {
    // imports the magic
    import A._

    override def pathTo:A=a;

    def y() {
       a1() ;
       this.a2();
   };
}
于 2014-01-29T17:42:43.877 に答える