2013-10-15 104 views
0

我碰到了Scala的一些設計問題,涉及到有立即撥打了主(或其他輔助)構造在斯卡拉

我覺得下面的例子演示了概念

class Matrix(args: AbstractRowColumn*) { ... } 

class Column(elem: Double*) extends AbstractRowColumn { ... } 

class Row(elem: Double*) extends AbstractRowColumn { ... } 

這裏輔助構造,我認爲矩陣應該由行或列構建。但是,這會導致問題,因爲每個都需要一組不同的邏輯,這些邏輯必須在調用構造函數之前首先完成。 (例如,在創建最終矩陣之前,列必須具有以不同於Row的順序處理的元素)

如何解決此問題?更好的設計?

+0

如果你的目的是使矩陣構造函數傳遞唯一的行或列只是,它不應該接受'AbstractRowColumn *'因爲這可能是一個混合物。 (到目前爲止的答案都是針對這個問題的。) –

回答

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 
} 
+0

不錯。 – Tyrick

+0

然後,您可以添加一個對象Matrix,該對象具有兩個重載的應用方法,一個接受Array [Row]或Row *並返回RowMatrix和一個Column等效項。 –

1

每個都需要一組不同的邏輯,首先必須在 調用構造函數之前完成。

聽起來像你需要某種時尚的builder例如,

val matrix = MatrixBuilder.withRows(....).build 
+0

我明白了,有點讓我難過。我希望班級能夠處理它。我覺得我不應該宣佈「withRows」,畢竟我是通過行! >。< – Tyrick

+0

然後給兩個方法相同的名稱。 –