2014-07-04 34 views
0

我有一个名为A的类,它扩展了特性XX有一个抽象变量x已在A类中实现。类A使用特征X中名为foo的功能之一。我正在尝试制作类A的伴侣对象,并在其中放入一些名为Ofoo的“静态”方法。我的问题是Ofoo使用foo。于是,我试着做这样的事情:通过对象扩展特质

trait X{ 
val x:String 
def foo = { 
    //Full implementation here 
    } 
} 

case class A extends X{ 
val x = "barbaz" 
// Class uses foo 
} 

object A extends X{ 
def Ofoo = { 
    //This also needs to use foo 
    } 
} 

我得到一个错误说A不能被实例变量x对象不特质X定义。 我应该如何构造A,以便它可以使用特征中定义的功能foo

+2

你应该解释你真正想要完成的事情(你真正的问题,而不是抽象的问题)。可能有一个简单的解决方案,但很难说如果我们不知道你在做什么。 – toto2

回答

3

编译器的行为与其应该一样。可以有两件事:foo使用x

如果是这种情况,则需要在编译器说明的地方声明x。你可以说:

object A{ 
    def ofoo = new X{val x = "default"}.foo 
} 

如果foo不使用x那么我不知道如果它甚至应该属于性状X。然后,您可以创建一个object X,然后有foo里面是这样的:

trait X{ 
    val x:String 
} 

object X{ 
    def foo = {} 
} 
+0

嗯,我可以把函数'foo'放到一个对象中,但是如何确保只有类'A'(和它的单例对象'A')可以访问它? –

+0

嗯,我不确定。 – Jatin

1

如何实现在Ax?这只是一个对象;它必须遵守相同的规则,其中包括实现正在扩展的任何类/特征的抽象成员。

object A extends X { 
    val x = "hello" 
    ... 
} 

只是因为它已经从X继承并实现x一个class A的同伴对象,并不意味着object X神奇地重新使用它。

实际上,从技术上讲,一个类和它的伴侣对象是没有关联的;他们唯一的关系是按惯例存在的


在另一方面,如果你想确保的x值是在这两个类A以及对象A,你可以在object A定义val x并在class A该值提取相同:

class A extends X { 
    val x = X.x 
    ... 
} 
object A extends X { 
    val x = "shared-value-of-x" 
    ... 
} 
+0

“事实上,从技术上讲,一个班级和它的同伴对象是没有联系的,他们唯一的关系是按照惯例存在的。”并不完全:他们看到对方的私人方法和领域。 –

+0

我怀疑我忘记了一些东西,谢谢! –

0

在任何速率,x必须由对象A或在其超类/ supertraits之一来定义。

基于先前提出的建议和OP的答复,我会认为富不应该容易从其他地方,这样的:

package pack { 

    trait X{ 
    val x:String 
    } 

    // Reachable only in the same source file 
    sealed trait Y extends X{ 

    // if foo doesn't use x below, no need to extend X, though 
    private[pack] def foo = { 
     //Full implementation here 
     println("x = "+x) 
    } 
    } 

    case class A() extends X with Y{ 
    val x = "barbaz" 
    // Class uses foo 
    foo 
    } 

    object A extends X with Y{ 
    val x = "barbatruc" 
    def ofoo = { 
     //This also needs to use foo 
     foo 
    } 
    } 

} 

其实我也很难理解的任择议定书想要什么。我同意toto2。