2012-12-04 26 views
1

给我一些帮助,我只是不能解决这个问题。 如何确保始终遵守getter方法的约束条件? 我的班有这样的形式:斯卡拉:不总是受到尊重的领域的限制

abstract class Element { 
    var name: String 
    var description: String 
} 

class Component (var name: String, var description: String) extends Element 

我的项目的目的,我需要使用VAR。 我想对必须始终遵守的字段name施加限制。 两个当我创建的Component一个实例如下:

val C1 = new Component ("C1 Component", "Description of C1") 

两个当我改变的值:

C1.name = "new value" 

如果我以这种方式创建的类:

abstract class Element { 
    protected var _name : String 
    // Getter 
    final def name = _name 
    // Setter 
    final def name_= (value:String):Unit = 
    if (value.size < 5) println ("ERROR: Bad Value") 
    else _name = value 

    var description: String 
} 

class Component (protected var _name : String, var description: String) extends Element 

在主要方法,因为我这里没有控制权:

val C1 = new Component ("C1", "Description of C1") 

但只有后来,当我改变的值:

C1.name = "comp" 

我希望我的getter总是被尊重。 我该怎么做?

回答

2
class Component (_name : String, var description: String) extends Element { 
    this.name = _name 
} 

此外,还要var _name私有的,所以子类可以对它进行设置,而无需使用setter方法。

+0

它并不能解决问题。 Plus:错误:类组件需要是抽象的,因为没有定义类型为String的元素中的变量_name(请注意,需要初始化变量 \t以定义) – user1826663

+0

@ user1826663因此定义它。 –

+0

对不起,但它仍然给我错误。错误:“重新分配给val”为“this.name = name”。 如果我将var _name设置为私有,那么在给她分配一个值之后。 – user1826663

1

在Scala中,整个类体构成了主要的构造函数。所以你可以调用setter作为构造函数的第一部分。在我看来,语法很杂乱。你可以做这样的事情:

abstract class Element { 
var name: String 
var description: String 
} 

class Component (private var _name :String, var description : String) extends Element { 
    name = _name 
    def name = _name 
    def name_=(value: String) = { 
    require(value.size > 5, "Bad value") 
    _name = value 
    } 
} 

然而。也许......不明智地以您使用它们的方式拥有vars。使用一个不可变的类并处理这个类的副本要好得多。因此,无论何时您需要修改该名称字段,只需使用不同的名称创建一个与旧的Component对象相同的新Component对象即可。有很多方法可以达到此目的(搜索镜头),但一个简单的方法是使用case classes上提供的copy方法。这里有一个例子:

我们改变Component类是一个案例类:

case class Component (private var _name :String, var description : String) extends Element { 
    name = _name 
    def name = _name 
    def name_=(value: String) = { 
    require(value.size > 5, "Bad value") 
    _name = value 
    } 
} 

而且我们使用的是这样的:

val C1 = new Component ("Some component name", "Description of C1") 
//Component(Some component name, Description of C1) 

val C2 = C1.copy(_name = "Another component name") 
// Component(Another component name ,Description of C1) 
+0

嗨,我有很多从Element继承的类,那么在它们的Element中检查会很好。 – user1826663