Estoy en una situación en la que tengo la necesidad de mezclar un rasgo definido en otro paquete. Para ayudar con las pruebas, un método protegido en este rasgo es un paquete calificado. Aquí está un ejemplo:Heredando un método protegido por paquete por una clase en un paquete diferente
package A {
trait X {
protected[A] def method(arg: Int)
}
}
package B {
class Y extends A.X {
protected[A] def method(arg: Int) { }
}
}
Compilar esto con scalac 2.9.1 rendimientos:
test.scala:9: error: A is not an enclosing class
protected[A] def method(arg: Int) { }
Cambio de la "protegido [A]" en la clase Y para cualquier otro resultado modificador de acceso en este:
test.scala:9: error: overriding method method in trait X of type (arg: Int)Unit;
method method has weaker access privileges; it should be at least protected[A]
override protected def method(arg: Int) { }
Mi pregunta es esta: Suponiendo que la definición de rasgo X no puede cambiar, ¿hay algún cambio en la clase Y que le permita extender el rasgo X? (conservando cierto nivel de acceso 'protegido')
Si esto no es posible, ¿existen otras estrategias de diseño recomendadas para evitar esto? (que no sea público 'método')
Debo agregar que estoy tratando de responder la simple pregunta de si esto es imposible por diseño, de modo que la única (simple) manera de corregirlo es cambiar 'protegido [A]' a 'público'. Simplemente parece una subclase independientemente de si el paquete debería poder acceder. ¿o no? – nu11ptr
Parece que la solución "correcta" aquí es dividir la definición de clase Y en una clase y un rasgo. Pondré el rasgo en un subpaquete de A, definiré allí el "método" y luego lo mezclaré con la clase Y. En el mundo real, A es "marketdata" y B es "intermediario", por lo que tiene sentido cuando finalmente tenemos una instancia de intermediario que también es un proveedor de datos para dividir esta funcionalidad, colocarla en un sub paquete de datos de mercado y mezclarla. De todos modos, este es probablemente un mejor diseño, ya que son dos preocupaciones completamente diferentes (manejo de pedidos vs. datos de mercado). – nu11ptr