Как «переопределить» внутренний класс в Scala? - PullRequest
9 голосов
/ 02 декабря 2010

В Scaladoc класса Enumeration # Val я могу прочитать: «Класс, реализующий тип Value. Этот класс может быть переопределен для изменения именования и целочисленного поведения перечисления».Я озадачен: как переопределить класс?Такие вещи, как override class Val extends super.Val недопустимы.

1 Ответ

12 голосов
/ 02 декабря 2010

В 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 только с использованием этого фабричного метода. В целом, этот шаблон требует дисциплины со стороны программиста, но его можно обеспечить, объявив конструкторы частными, вынудив программиста использовать фабричный метод.

...