1

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);
}

这是我第一次在 Scala 中编写,我知道实现上述目标的唯一方法是使用伴随对象,但它似乎不适用于这种情况

  • 伴生对象可以存储私有静态表吗?(好像没有……)
  • 如果我可以在伴生对象中声明表,是否可以从伴生类中引用它?(好像没有……)
  • add方法中,如何引用子类的实例并插入到表中?(问题也与this方法有关add
  • 在 Scala 中有什么好的做法?
4

2 回答 2

6
  1. 是的,它可以。

  2. 是的,您将其引用为TopThing.someTable(或仅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)
    }
    
于 2012-11-03T08:25:08.680 回答
0

对于问题 1:您可以使用 private[namespace]

对于问题 2:否,但您可以使用 import

class Xxx {
  import Xxx._
  ...
}  

对于问题3:我不知道如何回答。

对于问题 4:

trait TopThing {
  val someTable: HashTable[String, TopThing] 
}
class Xxx extend TopThing {
  val someTable = Xxx.someTable  
}
于 2012-11-03T07:05:24.187 回答