我希望类的受保护字段在子类中公开显示:
class MyClass(protected val someDao: SomeDao)
class TestMyClass extends MyClass(mock[SomeDao])
现在我想这样访问someDao
:
val testClass = new TestMyClass
testClass.someDao
我已经读过Java和Scala访问修饰符可以扩展但不限制在子类中(尽管这些只是构造函数参数,而不是私有字段本身)。我怎样才能在这个例子中实现这一目标?
修改:
提供的答案建议在基类中公开someDao
。这不是我想要的。我希望它保持私密,但只是在TestMyClass
类中将其可见性更改为public。
答案 0 :(得分:1)
据我所知,覆盖>>> [''.join(lst[s:e+1]) for s,e in itertools.product(range(len(lst)), repeat=2) if s <= e]
['A', 'AB', 'ABC', 'ABCD', 'B', 'BC', 'BCD', 'C', 'CD', 'D']
无法访问超级实现。
如果你可以修改基类,一个解决方案是明确定义一个可以覆盖的访问器方法;像这样的东西:
val
如果您无法更改基类,一种解决方法是使用不同的名称定义公共访问器方法:
class MyClass(_someDao: SomeDao) {
protected def someDao = _someDao
}
class TestMyClass extends MyClass(mock[SomeDao]) {
override def someDao = super.someDao
}
答案 1 :(得分:0)
将var
或val
添加到参数声明:
class MyClass(val someDao: SomeDao)
在这种情况下,只会为someDao
字段生成 getter 函数。因此,当您编写testClass.someDao
时,不会检索someDao
字段,而是使用 getter 函数。
关于此article演示的Scala中类参数可见性的良好示例。
为参数声明设置package scope:
class MyClass(private[lastPackageOfSomeDao] val someDao: SomeDao)