【问题标题】:Access a field created by the constructor in an abstract class (Scala)访问抽象类 (Scala) 中的构造函数创建的字段
【发布时间】:2012-10-24 07:56:01
【问题描述】:

我有一个实现一种方法的抽象类。

如何访问参数internalValue(由抽象类构造函数设置?)

abstract class Value(internalValue:Int) {
    def equal( v:Value ): Boolean

    def notEqual( v:Value ): Boolean = {

        //here I get an error on v.internalValue:
        //"value internalValue is not a member of Value"
        (internalValue != v.internalValue)
    }
}

case class Value1(internalValue:Int) extends Value(internalValue){
    def equal( v:Value1 ): Boolean = {
        //this works correctly
        (internalValue == v.internalValue)
    }
}

谢谢。

【问题讨论】:

    标签: scala compiler-errors abstract-class


    【解决方案1】:

    internalValue 定义为val

    abstract class Value(val internalValue: Int)
    

    或者如果您担心封装(名称internalValue 暗示),您可以使用private val

    abstract class Value(private val internalValue: Int)
    

    根本不声明任何修改是实际上等同于 (?) 类似于 private[this],这意味着:只有 Value 的这个特定实例可以访问这个私有字段 .

    【讨论】:

    • 我不认为它是等价的。 private[this] 被存储为实例的私有字段,而构造函数参数仅在它们用于过去构造时才被存储。
    • @paradigmatic:谢谢,但在其他方法中使用构造函数参数的 OP 情况下,它是等效的,对吗?我会更新我的答案。
    • 是的,在这种情况下它应该生成一个私有的最终字段。
    • 如果我将 abstract class Value(internalValue:Int) { 更改为 abstract class Value(val internalValue:Int) { 我在 Value1 上收到两个错误:“ - 覆盖 Int 类型的类值中的值 internalValue;值 internalValue 需要“覆盖”修饰符 - 类 Value1 需要抽象,因为类 Value 中的方法 equal 类型 (v: Value)Boolean 未定义(注意 Value 与 Value1 不匹配)"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2011-08-01
    相关资源
    最近更新 更多