扩展Scala中的类 - 新手查询

时间:2016-01-15 13:43:07

标签: scala

我有以下Scala类:

class ClassA (x2: Int, y2: Int) {
  var x = x2
  var y = y2
}


class ClassB (x2: Int, y2: Int, z2: Int) extends ClassA (x2, y2) {
  var z = z2
}

如果这些类被用作值对象并且没有任何方法,那么使用ClassA扩展ClassB是否重要?无论如何,我需要定义ClassB中的所有字段。

2 个答案:

答案 0 :(得分:1)

嗯,没有方法你基本上不使用多态,所以继承的价值大大减少了。对于严格值对象,请使用case classes,如下所示:

rpart.plot

Thad可以解决这个问题,现在您的课程也有默认的case class ClassA(x:Int, y:Int) case class ClassB(x: Int, y: Int, z: Int) copyequalshash操作。或者,如果您正在处理大量变量,则可以尝试合成:

apply

或者,如果你可以省去构造函数并且愿意使用默认值,你可以避免重新定义东西并使用特征:

case class ClassB(a: ClassA, z2: Int)

客观地说,这取决于你最终用这些做什么。根据我的经验,良好的面向对象设计通常最终会有方法。将数据和对其进行操作的方法分组到一个有凝聚力的cblack框中就是整个想法。但是对于功能性程序,我最终使用了案例类。

答案 1 :(得分:1)

首先,如果你的真实例子并不比你提出的更复杂,你可以这样做:

class ClassA (var x: Int, var y: Int)
class ClassB (x: Int, y: Int, var z: Int) extends ClassA(x, y)

它的冗长等同,但你仍然有很多样板。

要回答是否应该使用继承的问题,你应该回答另一个问题:是句子"类ClassB的对象也是类ClassA的对象"是的,它是否符合LSP。如果您使用ClassB需要ClassA,那么我认为继承是一个有效的决定。

或者你可以使用合成,让ClassB包含ClassA的实例,无论看起来更合乎逻辑。

我还鼓励您使用不可变类,如果您认为您的类不相关或使用合成。您将获得一个免费的copy方法,可以让您轻松地修改"你的对象,还有更多。