【发布时间】:2011-05-22 04:10:25
【问题描述】:
在 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”这样的方法,并且只返回一个复制构造函数参数的元组。有什么办法吗?
我意识到另一种方法是使用某种拦截器来创建对象,但我不知道如何在不必为每个子类编写样板代码的情况下做到这一点。
编辑:案例类方法很优雅,但在我的情况下不适合,因为我们必须能够允许具体子类扩展其他具体子类。
【问题讨论】:
标签: scala reflection