【问题标题】:Make constructor parameters public in subclass在子类中公开构造函数参数
【发布时间】:2016-05-02 14:14:36
【问题描述】:

我希望某个类的受保护字段在子类中公开可见:

class MyClass(protected val someDao: SomeDao)

class TestMyClass extends MyClass(mock[SomeDao])

现在我想像这样访问someDao

val testClass = new TestMyClass
testClass.someDao

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    据我所知,被覆盖的val 无法访问超级实现。

    如果可以修改基类,一种解决方案是显式定义访问器方法,该方法可以被覆盖;像这样:

    class MyClass(_someDao: SomeDao) {
      protected def someDao = _someDao
    }
    
    class TestMyClass extends MyClass(mock[SomeDao]) {
      override def someDao = super.someDao
    }
    

    如果您无法更改基类,一种解决方法是定义一个具有不同名称的公共访问器方法:

    class MyClass(protected val someDao: SomeDao)
    
    class TestMyClass extends MyClass(mock[SomeDao]) {
      def someDao2 = someDao
    }
    

    【讨论】:

      【解决方案2】:

      在参数声明中添加varval

      class MyClass(val someDao: SomeDao)
      

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

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

      关于您最近的更新

      设置package scope为参数声明:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-12
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多