2012-11-03 68 views
1

Java中,抽象類的靜態成員將通過其子類繼承。 像如何在Scala中實現這個Java機制?

abstract class TopThing{ 
    public TopThing next; 
    public TopThing(TopThing tt){ 
     this.next = tt 
    } 

    private static HashTable<String, TopThing> someTable = new HashTable<String,TopThing>(); 
    protected void add(String name) { 
     someTable.put(name, this); 
    public static Parent forName(String name) { 
     return someTable.get(name) ; 
    } 
} 

class SomeSpecific extends TopThing { 
    public final String name; 
    public SomeSpecific (String name, TopThing tt) { 
     super(tt); 
     this.name = name; 
     this.add(name); 
} 

這是我第一次在斯卡拉, 寫我知道實現上述使用的同伴對象的唯一方法,但它似乎對這種情況下

  • 可不可以不工作伴隨對象存儲私有靜態表? (好像不是......)
  • 如果我可以在伴隨對象中聲明該表,是否可以從伴隨類引用 ? (看起來不是......)
  • add方法中,子類的實例如何被引用並插入到表中? (這個問題也是thisadd方法)
  • 在斯卡拉這是一個很好的做法嗎?

回答

6
  1. 是的,可以。

  2. 是的,你可以參考它作爲TopThing.someTable(或之後import TopThing._)。

  3. 與Java相同:this。所以

    abstract class TopThing(val next: TopThing) { 
        protected def add(name: String) { 
        TopThing.someTable += (name -> this) 
        } 
    } 
    
    object TopThing { 
        private val someTable = collection.mutable.Map[String,TopThing]() 
    
        def forName(name: String) = someTable.get(name) 
    } 
    
    class SomeSpecific(val name: String, next: TopThing) extends TopThing(next) { 
        this.add(name) 
    } 
    
0

問題1:你可以用私人[命名空間]

問題2:沒有,但你可以使用進口

class Xxx { 
    import Xxx._ 
    ... 
} 

問題3:我不知道如何回答問題。

對於問題4:

trait TopThing { 
    val someTable: HashTable[String, TopThing] 
} 
class Xxx extend TopThing { 
    val someTable = Xxx.someTable 
} 
+0

「我不知道怎麼回答。」我很樂意在高質量的T恤上擁有這款產品。最好用洛爾卡特。另外,我會+1回答子彈#4,除了someTable應該是表格,我認爲,在其他迴應。 –

+3

將表放置在trait中將創建一個_per instance_,它與Java代碼的_static_表完全不同。 – DaoWen