Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何定义一个通过调用方法将参数传递给超类的对象?_Scala_Extend_Traits - Fatal编程技术网

Scala 如何定义一个通过调用方法将参数传递给超类的对象?

Scala 如何定义一个通过调用方法将参数传递给超类的对象?,scala,extend,traits,Scala,Extend,Traits,我有一个超级班: class P(name:String) 还有一个特点: trait SysConfig { def prop(key:String) = System.getProperty(key) } 然后我想定义一个扩展p的对象: object C extends P(prop("user.name") 它没有被编译,因为它找不到prop方法。因此,我使用系统配置: object C extends P(prop("user.name") with SysConfig 不幸

我有一个超级班:

class P(name:String)
还有一个特点:

trait SysConfig {
  def prop(key:String) = System.getProperty(key)
}
然后我想定义一个扩展
p
的对象:

object C extends P(prop("user.name")
它没有被编译,因为它找不到
prop
方法。因此,我使用系统配置:

object C extends P(prop("user.name") with SysConfig
不幸的是,它仍然无法编译


有什么方法可以让它工作吗?

参数是在当前定义之外的上下文中计算的,所以没有

您必须将计算放在另一个对象中

如果你这么想,答案也是否定的:

scala> class P(name: String)
defined class P

scala> trait Prop { def prop(k: String) = sys.props(k) }
defined trait Prop

scala> class C(p: String = C.prop("user.name")) extends P(p); object C extends C() with Prop
<console>:9: error: module extending its companion class cannot use default constructor arguments
       class C(p: String = C.prop("user.name")) extends P(p); object C extends C() with Prop
                                                                               ^
scala>P类(名称:String)
定义类P
scala>trait Prop{def Prop(k:String)=sys.props(k)}
定义特征道具
scala>class C(p:String=C.prop(“user.name”))扩展了p(p);对象C使用Prop扩展了C()
:9:错误:扩展其伴生类的模块无法使用默认构造函数参数
类C(p:String=C.prop(“user.name”))扩展了p(p);对象C使用Prop扩展了C()
^
这是因为默认参数是由同伴定义的方法

同样地

scala> class C(p: String) extends P(p); object C extends C(C.prop("user.name")) with Prop
<console>:9: error: super constructor cannot be passed a self reference unless parameter is declared by-name
       class C(p: String) extends P(p); object C extends C(C.prop("user.name")) with Prop
                                                           ^
scala>C类(p:String)扩展了p(p);对象C使用prop扩展C(C.prop(“user.name”))
:9:错误:除非按名称声明参数,否则无法向超级构造函数传递自引用
类C(p:String)扩展了p(p);对象C使用prop扩展C(C.prop(“user.name”))
^

如果我没有误解:),我认为这里有两件事是不可能的

  • 特质组合或可堆叠特质总是让正确的特质获胜。在本例中,它尝试使用左一覆盖右一

  • 当我们使用性状组合时,性状结构不会改变。我们能做的唯一灵活的事情就是子特质多态性。蛋糕图案使用这种方式,但线性化是一个问题。然而,这与此无关

  • 我认为正确的方法是创建一个类/特征来完成覆盖

    class P(name:String)
    
    trait SysConfig {
      def prop(key:String) = System.getProperty(key)
    }
    
    class C extends P("123") with SysConfig {
      override def prop(key: String) = "123"
    }
    
    trait Foo extends P with SysConfig {
      override def prop(key: String) = "123"
    }
    
    new C