2011-05-27 109 views
0

我正在C#中編寫一個用於處理矩陣的類庫,目前正在處理名爲ComplexMatrix的Matrix的子類。 Matrix基類使用Int32數據類型(更高級的版本使用Double)和System.Numerics.Complex結構(.NET 4)的ComplexMatrix。當從基類繼承ToString()時數據類型混淆

對於基類,我推翻的ToString()爲:

| 1 2 | 
| 3 4 | printed as {{1,2}{3,4}} 

的System.Numerics.Complex結構覆蓋在形式的ToString():

a+bi printed as (a,b) where a is real and b is imaginary 

當ComplexMatrix重寫的ToString ,我只是用了這個方法:

public override string ToString() 
{ 
    return base.ToString(); 
} 

不幸的是,對於一個複雜的矩陣,下面的發生:

| 1+1i 1+2i | 
| 2+1i 2+2i | printed as {{0,0}{0,0}} rather than {{(1,1),(1,2)}{(2,1)(2,2)}} 

原來的ToString()我寫的Matrix類代碼:

public override string ToString() 
{ 
    StringBuilder matrixString = new StringBuilder(); 
    string comma = ""; 

    matrixString.Append("{"); 
    for (int i = 0; i < this.Rows; i++) 
    { 
     matrixString.Append("{"); 
     for (int j = 0; j < this.Columns; j++) 
     { 
      if (j == 0) comma = ""; 
      else comma = ","; 

      matrixString.Append(comma + this.Elements[i, j].ToString()); 
     } 
     matrixString.Append("}"); 
    } 
    matrixString.Append("}"); 
    return matrixString.ToString(); 
} 

在上面的代碼:

  • this.Elements屬性:在Matrix類,這是一個Int32類型的二維數組(更新,更高級版本中的Double);它是System.Numerics.Complex類型的ComplexMatrix
  • this.Rows,this.Columns屬性:行和列的分別是矩陣的數量

幾個問題我已經是:

  • 當在ComplexMatrix實例上調用ToString並調用基本ToString()方法時,是從Complex到Int32發生的嘗試類型轉換?
  • 由於ComplexMatrix Elements屬性(Complex [,]類型)隱藏了基類Elements屬性(Int32 [,]類型),因此new關鍵字是必需的嗎?
  • 「this」kwyword被視爲Matrix類型而不是ComplexMatrix?
+0

只是一個音符。 '公共重寫字符串的ToString(){ 回報 base.ToString();你也可以刪除它。 – 2011-05-27 14:35:20

+1

另一個說明與該問題無關。我認爲你的課堂體系顛倒了。基類應該總是更普遍的情況,而不是周圍的方式。因此DoubleMatrix應該繼承形式ComplexMatrix,因爲double是複數形式的子類。這樣,您只需要一個Complex [,]數組作爲在基本情況下定義的矩陣元素的存儲,它可以存儲複數和雙精度(您只需要在雙精度和複數之間定義一個隱式轉換)。一個int矩陣將繼承DoubleMatrix,但我無法看到使用int Matrix。 – InBetween 2011-05-27 14:41:14

回答

2

我覺得你的問題如下:
Elements屬性未標註在MatrixvirtualComplexMatrix類中的Elements屬性隱藏Matrix類的Elements屬性。因此,多態性不起作用,並且Matrix中的ToString方法訪問Matrix.Elements而不是ComplexMatrix.Elements。但由於Elements是屬性,您想要更改屬性的類型,因此無論如何您都不能使用virtual

爲了解決這個問題,你應該做這樣的事情:

  • 創建想要矩陣值作爲泛型參數的類型
  • 創建一個SimpleMatrix類,從這個基地繼承通用基類並通過int作爲通用參數。
  • 創建ComplexMatrix類從該基類繼承並將Complex作爲通用參數。
0

你真的不能做你正在嘗試做的。

的問題是,對於所有的數字類型在C#中沒有超。所以你不能在這樣的課堂上用一種數字類型代替另一種數字類型(並且仍然對它們進行數學計算)。

你可以做的是創造一個IMatrixElement接口。然後創建實現該接口的具體類MatrixElementInt,MatrixElementDouble,MatrixElementComplex。然後在構建矩陣時提供正確的元素類型。

interface IMatrixElement 
{ 
    IMatrixElement Add(IMatrixElement a, IMatrixElement b); 
    IMatrixElement Multiply(IMatrixElement a, IMatrixElement b); 
    string ToString(); 
} 
+0

什麼時候,哦,什麼時候他們會包括運營商對泛型的限制... Matrix 會很可愛 – InBetween 2011-05-27 14:53:26