[英]Static inner classes in scala
Scala中使用Java進行此類操作的模擬是什么:
public class Outer {
private Inner inner;
public static class Inner {
}
public Inner getInner() { return inner; }
}
我特別希望我的內部類不必具有完全限定的名稱 - 即我想要Trade.Type
,而不是TradeType
。 所以在Scala我想象它可能是這樣的:
class Outer(val inner: Inner) {
object Inner
}
但是,這似乎並沒有工作:我的斯卡拉Inner
似乎沒有從外部可見Outer
類。 一個解決方案當然是:
class Inner
class Outer(val inner: Inner)
哪個是好的 - 但由於我的類的名稱, Inner
實際上是Outer
的“類型”,而Outer
實際上有一個很長的名字。 所以:
class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)
這是冗長而可怕的。 我可以用Type
替換SomeHorriblyLongNameType
,但是它與它所關聯的類之間沒有明顯的聯系。 表示不快
如果不需要訪問內部類中的外部類(在Java中,您的內部類被聲明為static
),則可以執行此類操作:
object A{
class B {
val x = 3
}
}
class A {
// implementation of class here
}
println(new A.B().x)
正如其他人所指出的那樣,“靜態”類應該放在伴隨對象中。
在Scala中,作為類成員的類,特征和對象是路徑相關的。 例如:
class Button {
class Click
}
val ok = new Button
val cancel = new Button
val c1 = new ok.Click
val c2 = new cancel.Click
現在c1和c2是-different-類的實例。 一個類是ok.Click,另一個是cancel.Click。 如果要引用所有Click類的類型,可以說Button#Click。
不確定我完全理解你的用例...如果它可以幫助你,類中的對象就像實例的字段一樣可見,例如
case class C(var x: Int)
class A { case object b extends C(0) }
val a = new A
println(a.b.x)
a.b.x = 2
println(a.b.x)
此外,您可以使用對象完美地覆蓋父級的val:
case class C(var x: Int)
class A { val y: C = C(0) }
class B extends A { override case object y extends C(2) }
val a: A = new B
println(a.y.x)
在scala中,如果需要創建一些靜態方法,則可以使用具有相同名稱的伴隨對象,在該對象中存儲所有偽靜態方法。 例如:
class A {
}
object A {
def xpto // define some pseudo static methods here..
}
然后你可以使用A.xpto
。
嘗試閱讀有關scala上的隨播模塊的更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.