【问题标题】:Get a class field from trait从 trait 中获取类字段
【发布时间】:2012-07-27 17:23:35
【问题描述】:

我有一个特点:

trait A {
  /*Some methods*/
}

而且我有很多课:

class B(val argument: SomeClass) extends A {
  /*Some methods*/
}

我想从 trait 中得到一个参数。我可以在每个类和特征中创建方法 getArgument:

trait A {
  def getArgument: SomeClass
  /*Some methods*/
}
class B(val argument: SomeClass) extends A {
  def getArgument = argument
  /*Some methods*/
}

或者使用反射:

trait A {
  def getArgument = {
    val f =  this.getClass.getDeclaredField("argument")
    f.setAccessible(true)
    f.get(this).asInstanceOf[SomeClass]
  }
  /*Some methods*/
}
class B(val argument: SomeClass) extends A {
  /*Some methods*/
}

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: scala


    【解决方案1】:

    你可以有抽象值:

    trait A {
      val argument: SomeClass
    }
    
    class B(val argument: SomeClass) extends A
    

    您甚至不需要将其限制为 val:

    trait A {
      def argument: SomeClass
    }
    
    class B(val argument: SomeClass) extends A
    
    class C extends A {
      def argument : SomeClass = ....
    }
    

    【讨论】:

      【解决方案2】:

      一个老问题,但为了搜索者...... 您可以定义this 的类型并访问其成员:

      class ArgContainer(val argument: SomeClass)
      
      class B(argument: SomeClass) extends ArgContainer(argument) with A
      class C(argument: SomeClass) extends ArgContainer(argument) with A
      
      trait A {
        this: ArgContainer =>
      
        def print() = {
          println(this.argument)
        }
      }
      

      在此处查看更多信息How to use scala trait with `self` reference?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多