![](/img/trans.png)
[英]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.