我在Scala中遇到了一些与辅助构造函数有关的设计问题,这些辅助构造函数必须立即调用主要(或其他辅助)
我认为以下示例演示了概念
class Matrix(args: AbstractRowColumn*) { ... }
class Column(elem: Double*) extends AbstractRowColumn { ... }
class Row(elem: Double*) extends AbstractRowColumn { ... }
在这里,我认为Matrix应该由行或列构建。但是,这会导致问题,因为每个都需要一组不同的逻辑,首先必须在调用构造函数之前完成。 (e.i Column必须在创建最终Matrix之前以与Row不同的顺序处理它的元素)
我如何解决这个问题?更好的设计?
答案 0 :(得分:3)
Scala的主要构造函数的重点在于每个类应该具有单个一致的内部表示,将行为附加到指定为类参数的(理想上不可变的)数据集。
考虑将Matrix
抽象为一些基本操作,然后进行两次实现:
abstract class Matrix {
def get(r: Int, c: Int): Double
def numRows: Int
def numCols: Int
}
case class RowMatrix(rows: Array[Row]) extends Matrix {
def get(r: Int, c: Int): Double = rows(r)(c)
def numRows: Int = rows.length
def numCols: Int = rows(0).length
}
case class ColumnMatrix(cols: Array[Column]) extends Matrix {
def get(r: Int, c: Int): Double = cols(c)(r)
def numRows: Int = cols(0).length
def numCols: Int = cols.length
}
答案 1 :(得分:1)