В Scala нет виртуальных классов (пока), поэтому вы не можете написать override class Val ...
, а затем убедитесь, что вызов new Val
будет динамически выбирать правильный класс для нового экземпляра. Вместо этого произойдет то, что класс будет выбран на основе типа ссылки на экземпляр включающего класса (в данном случае Enumeration
).
Основной трюк для эмуляции виртуальных классов - написать class Val extends super.Val
, а затем переопределить защищенный метод, который служит фабрикой для экземпляров класса. В этом случае вам также придется переопределить метод:
protected def Value(i: Int, name: String): Value = new Val(i, name)
Enumeration
создаст экземпляры Val
только с использованием этого фабричного метода. В целом, этот шаблон требует дисциплины со стороны программиста, но его можно обеспечить, объявив конструкторы частными, вынудив программиста использовать фабричный метод.