У меня есть набор классов, которые управляют хранилищем db в иерархии классов, как описано ниже, и хотел бы, чтобы класс case мог получить доступ к защищенным методам в родительском классе объекта сопутствующего :Scala: Использование защищенных методов родительского объекта
class TableBase[T] {
protected def insert(...):T {...}
protected def update(...) {...}
// Other "raw" CRUD-methods that I don't want the
// world to have access to
}
object User extends TableBase[User] {
}
case class User(id:Int, email:String) {
// But here it would be really useful to access the "raw" CRUD methods:
def changeEmail(newEmail:String) = User.update(...)
}
Единственная проблема заключается в том, что вызов User.update в User.changeEmail является незаконным, так как пользователь (класс) не находится в цепочке наследования от TableBase:
method update in class TableBase cannot be accessed in object models.User
Access to protected method update not permitted because enclosing class
class User in package models is not a subclass of class TableBase in package
models where target is defined
есть (удобно), чтобы разрешить этот тип вызова?
Прямо сейчас я должен либо переместить функции changeEmail-типа в singleton, что делает код вызова довольно многословным, либо дублирует сигнатуры метода.
Объявляет методы ['private' или' protected' на уровне пакета] (http://www.artima.com/pins1ed/packages-and-imports.html#lst:access-qualifiers) вариант ? – DaoWen
Теоретически, да. Это потребует довольно много перекодировки - TableBase находится в отдельном проекте с символическим источником, используемом несколькими другими проектами, поэтому искажение пространства пакета будет бесполезным. – Jxtps