[英]Scala's case class and its constructor parameter passing to super classes
[英]Passing class name to super class constructor in Scala via reflection
如何将类的名称传递给其超类构造函数,甚至有可能? 我正在考虑这样的事情:
class TestClass extends SuperTestRequiringName(TestClass.getClass.getName) {}
这比将名称作为硬编码字符串传递更好,因为在重命名重构过程中会保持一致性。
更好的是实际的运行时类,因此,如果可能的话,我将获得子类的名称。 但这并不能正常工作:
class TestClass extends SuperTestRequiringName(this.getClass.getName) {}
我一般不问如何在运行时访问超类内部的子类名称。 重要的是,可以将类名用作超级构造函数参数,以便超级类可以将其传递给自己的超级类(从我无法更改的库中)。
class TestClass extends SuperTestRequiringName(classOf[TestClass].getName)
在Scala中, classOf[A]
与Java中的A.class
相同。
getClass
是一个方法,您只能调用类的实例。
我不确定我是否正确理解您的问题,但是您可以为此使用ClassTag
。 例如;
import scala.reflect._
class SuperTestRequiringName(name: String) {}
class TestClass extends SuperTestRequiringName(classTag[TestClass].runtimeClass.getName)
希望对您有所帮助!
我认为您的问题没有一个好的解决方案。 JVM内存模型的工作方式是,在调用基本构造函数之前,甚至无法获得自己的类名,都不能使用this
。 如果您从库的类继承的原因是重用其功能,而不是需要在使用基类的相同上下文中实际使用您的类,那么建议您用组成替换继承,这是解决问题的正确方法无论如何,这样的问题。 代码如下:
case class Wrapper(s: String)
class LibraryClass(val w: Wrapper) {
def someUsefulStuff(n: Int): String = ???
def someNotUsefulStuff(n: Int): String = ???
}
class Base() {
private val delegate:LibraryClass = new LibraryClass(Wrapper(this.getClass.getName))
// expose useful methods from the delegate
// depending on logic maybe decorate them as protected
def someUsefulStuff(n: Int): String = delegate.someUsefulStuff(n)
}
class LeafA extends Base
class LeafB extends Base
在线查看此示例。
如果确实需要继承自LibraryClass
以便在这些上下文中使用,则可能必须像@ygor解决方案一样,使子类显式传递字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.