Scala 将一个变量定义为特质中的受保护变量有意义吗?
无法实例化特征。因此,它的字段只能由扩展它的类/特征/对象访问。因此,这两段代码实际上是相同的:Scala 将一个变量定义为特质中的受保护变量有意义吗?,scala,protected,traits,Scala,Protected,Traits,无法实例化特征。因此,它的字段只能由扩展它的类/特征/对象访问。因此,这两段代码实际上是相同的: trait foo{ protected val fish:String } class bar extends foo{ val fish = "catfish" } 及 protectedaccess修饰符对于traits是多余的。对吗?这是多余的,因为在第一个版本中,您已将成员在实现类中的可见性从受保护的更改为公共的(通过不将其标记为受保护的)。如果不这样做,那么您可以看到在
trait foo{
protected val fish:String
}
class bar extends foo{
val fish = "catfish"
}
及
protected
access修饰符对于traits是多余的。对吗?这是多余的,因为在第一个版本中,您已将成员在实现类中的可见性从受保护的更改为公共的(通过不将其标记为受保护的)。如果不这样做,那么您可以看到在trait中将成员定义为protected
,这意味着类必须实现它,但不能通过其公共API公开它
trait Foo {
protected val fish: String
}
class Bar extends Foo {
override protected val fish = "catfish"
}
val bar = new Bar
bar.fish // not visible
它是多余的,只是因为在第一个版本中,您已将成员在实现类中的可见性从受保护
更改为公共
(通过不将其标记为受保护
)。如果不这样做,那么您可以看到在trait中将成员定义为protected
,这意味着类必须实现它,但不能通过其公共API公开它
trait Foo {
protected val fish: String
}
class Bar extends Foo {
override protected val fish = "catfish"
}
val bar = new Bar
bar.fish // not visible
如果trait有一个实现的方法baz
,而扩展trait的类只使用方法baz
,该怎么办?我们还需要受保护的修改器吗?不,但是你要通过公共界面暴露baz
protected
的意思是“对外部用户隐藏,但在继承时允许重写”。很抱歉,我不明白你说的“通过公共接口公开baz”?你这是什么意思?@Core\u我的意思是,当你实例化一个新的条形码时,你不能调用受保护的成员,这是一种隐私。有意义吗?如果trait有一个实现的方法baz
,而扩展trait的类只使用方法baz
?我们还需要受保护的修改器吗?不,但是你要通过公共界面暴露baz
protected
的意思是“对外部用户隐藏,但在继承时允许重写”。很抱歉,我不明白你说的“通过公共接口公开baz”?你这是什么意思?@Core\u我的意思是,当你实例化一个新的条形码时,你不能调用受保护的成员,这是一种隐私。有意义吗?在我看来,如果您在Scala代码中使用私有和/或受保护,这意味着您没有真正执行FP,您非常坚持OOP。@samthebest是的,这是真的。顺便说一句,如果您在Scala代码中使用private和/或protected,这意味着您没有真正执行FP,您非常坚持OOP。@samthebest是的,这是真的。顺便提一下