我有以下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中的所有字段。
答案 0 :(得分:1)
嗯,没有方法你基本上不使用多态,所以继承的价值大大减少了。对于严格值对象,请使用case classes,如下所示:
rpart.plot
Thad可以解决这个问题,现在您的课程也有默认的case class ClassA(x:Int, y:Int)
case class ClassB(x: Int, y: Int, z: Int)
,copy
,equals
和hash
操作。或者,如果您正在处理大量变量,则可以尝试合成:
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
方法,可以让您轻松地修改"你的对象,还有更多。