在子类中使构造函数参数公开

时间:2016-05-02 14:14:36

标签: scala

我希望类的受保护字段在子类中公开显示:

class MyClass(protected val someDao: SomeDao)

class TestMyClass extends MyClass(mock[SomeDao])

现在我想这样访问someDao

val testClass = new TestMyClass
testClass.someDao

我已经读过Java和Scala访问修饰符可以扩展但不限制在子类中(尽管这些只是构造函数参数,而不是私有字段本身)。我怎样才能在这个例子中实现这一目标?

修改: 提供的答案建议在基类中公开someDao。这不是我想要的。我希望它保持私密,但只是在TestMyClass类中将其可见性更改为public。

2 个答案:

答案 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)

varval添加到参数声明:

class MyClass(val someDao: SomeDao)

在这种情况下,只会为someDao字段生成 getter 函数。因此,当您编写testClass.someDao时,不会检索someDao字段,而是使用 getter 函数。

关于此article演示的Scala中类参数可见性的良好示例。

关于您的上次更新

为参数声明设置package scope

class MyClass(private[lastPackageOfSomeDao] val someDao: SomeDao)