加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala:以可继承的方式检索用于构造类实例的参数?

发布时间:2020-12-16 21:33:26 所属栏目:安全 来源:网络整理
导读:在 scala中,我有一个基础类/特征被很多小孩类扩展的情况.我将通过获取类的名称和用于实例化类的参数来序列化一个子类的实例(以便稍后重建).使用反射来获取类实例的名称很容易,但我不知道如何以不需要我在每个子类中编写代码的方式获取实例的参数.这也需要通
在 scala中,我有一个基础类/特征被很多小孩类扩展的情况.我将通过获取类的名称和用于实例化类的参数来序列化一个子类的实例(以便稍后重建).使用反射来获取类实例的名称很容易,但我不知道如何以不需要我在每个子类中编写代码的方式获取实例的参数.这也需要通过名称引用的参数.这似乎很棘手,因为每个子类可能具有完全不同的构造函数参数的数量和类型:

abstract class Base {
  // ideally implements some way of finding out the arguments used to construct this object
  def getArgs = {...}
}

class ChildA() // args would be a 0-tuple

class ChildB(arg1: Int) // getArgs would be a 1-tuple of arg1

class ChildC(arg1: Double,arg2: Boolean) // args would be a 2-tuple of (arg1,arg2)

// etc...

我想避免的是让每个类实现一个方法,如“getArgs”,只是返回一个从构造函数重复参数的元组.有什么办法吗?

我意识到一种替代方法是为对象创建一些拦截器,但是我无法弄清楚如何做,而不必为每个子类编写样板代码.

编辑:case类方法是优雅的,但在我的情况下是不合适的,因为我们必须能够允许具体的小孩类来扩展其他具体的小孩类.

解决方法

如果您的目标是避免在每个子类中编写代码以捕获参数,并且所有子类都处于平面层次结构中,则直接从Base继承,而不是彼此继承,则应考虑将其声明为案例类.然后他们会自动延长 Product,您可以使用productIterator和productIterator.将所有参数保存到Array [Any](我正在使用Array,因为当您稍后反复调用这些类的构造函数时,这是必需的):

scala> def toArray(p: Product) = p.productIterator.toArray
toArray: (p: Product)Array[Any]

scala> case class ChildA()
defined class ChildA

scala> toArray(ChildA())
res0: Array[Any] = Array()

scala> case class ChildB(arg1: Int)
defined class ChildB

scala> toArray(ChildB(42))
res1: Array[Any] = Array(42)

如果要将ArArray只接受Base的子类,则将其参数声明为Product with Base.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读