Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 强制继承类实现受保护的方法_Scala - Fatal编程技术网

Scala 强制继承类实现受保护的方法

Scala 强制继承类实现受保护的方法,scala,Scala,我有一个特点: trait A { def some: Int } 以及一个将其混合在一起的物体: object B extends A { def some = 1 } 问题是,是否有一种方法可以在a中声明some,例如,所有继承对象都必须将some方法声明为受保护?在B中的some的上述实现中,编译器会大喊什么 更新: 只是澄清一下我的问题的目的:在一个组织中,有一些软件开发标准是一致同意的。这些标准,例如“当继承自trait A”时,some方法始终声明为private”,通常

我有一个特点:

trait A {
  def some: Int
}
以及一个将其混合在一起的物体:

object B extends A {
  def some = 1
}
问题是,是否有一种方法可以在
a
中声明
some
,例如,所有继承对象都必须将
some
方法声明为受保护?在
B
中的
some
的上述实现中,编译器会大喊什么

更新: 只是澄清一下我的问题的目的:在一个组织中,有一些软件开发标准是一致同意的。这些标准,例如“当继承自
trait A
”时,
some
方法始终声明为
private
”,通常通过列出所有标准的规范或文档或通过Jenkins等工具进行沟通。。。我想知道我们是否可以更进一步,将这些标准正确地放在代码中,这样可以节省大量时间来纠正Jenkins提出的问题

更新2: 我能想到的解决办法如下:

abstract class A(
   protected val some: Int   
){
  protected def none: String
}
使用
抽象类
而不是
特征
,并将默认情况下需要保护的函数或值传递到构造函数中:

object B extends A(some = 1) {
  def none: String = "none"
}
请注意,在这种情况下,
some
在默认情况下是受保护的,除非开发人员决定通过另一种方法公开它。但是,无法保证默认情况下,
none
也将受到
保护

这适用于我上面描述的用例。这个实现的问题是,如果我们有一个
抽象类
es的层次结构,我们必须将父级的所有构造函数参数添加到层次结构中的每个继承子级。例如:

abstract class A(
   protected val some: Int   
)

abstract class B(
    someImp: Int,
    protected val none: String    
) extends A(some = someImp)

object C extends B(
  someImp = 1, 
  none = "none"    
)
相反,使用
trait
s,我们可以简单地编写:

trait A{
  protected val some: Int   
}

trait B extends A{
  protected val none: String    
} 

object C extends B{
  val some = 1
  val none = "none"
}

我看不到任何直接的方法来限制子类为继承成员选择更广泛的可见性

这取决于为什么要隐藏字段,但如果目的只是禁止最终用户访问字段,则可以使用稍微修改的蛋糕模式:

trait A {
  trait A0 {
      protected def some: Int
  }
  def instance: A0
}

object B extends A {
  def instance = new A0 {
    def some = 5
  }
}
是的,看起来很恶心,但当有人试图执行以下操作时,编译器会大叫:

B.instance.some

此解决方案的另一个版本只是执行示例中的操作(在A中向成员“some”添加protected),但从不直接公开类型B的引用(始终返回类型A的引用)

这将解决部分问题,最终用户将无法使用some方法。但我真正想要的是,继承我的trait的开发人员将被迫将其声明为private或protected。因为这不会阻止未来的开发人员以公开方法声明
some
方法。