簡體   English   中英

從基礎 class 繼承 ToString() 時的數據類型混淆

[英]Data type confusion when inheriting ToString() from base class

我正在 C# 中編寫一個用於處理矩陣的 class 庫,目前正在研究稱為 ComplexMatrix 的 Matrix 子類。 矩陣基礎 class 使用 Int32 數據類型的值(更高級的版本使用 Double)和 System.Numerics.Complex 結構 (.NET 4) 的 ComplexMatrix。

對於基礎 class,我將 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)}}

我為 Matrix class 編寫的原始 ToString() 代碼是:

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 屬性:在矩陣 class 中,這是一個 Int32 類型的二維數組(在更新、更高級的版本中為雙精度); 它是 ComplexMatrix 中的 System.Numerics.Complex 類型
  • this.Rows, this.Columns 屬性:矩陣的行數和列數

我有幾個問題是:

  • 當在 ComplexMatrix 實例上調用 ToString 並調用基本 ToString() 方法時,是否會發生從 Complex 到 Int32 的類型轉換嘗試?
  • 由於 ComplexMatrix Elements 屬性(Complex[,] 類型)隱藏了基本 class Elements 屬性(Int32[,] 類型),是否需要新關鍵字?
  • “this”kwyword 是否被視為 Matrix 類型而不是 ComplexMatrix?

我認為您的問題如下:
Elements屬性在Matrix class 中未標記為virtual ComplexMatrix class 中的Elements屬性隱藏了Matrix class 的Elements屬性。 因此多態性不起作用,並且Matrix中的ToString方法訪問Matrix.Elements而不是ComplexMatrix.Elements 但是因為Elements是一個屬性,而你想改變屬性的類型,所以無論如何也不能使用virtual

要解決此問題,您應該執行以下操作:

  • 創建一個通用基礎 class ,它將矩陣值的類型作為通用參數
  • 創建一個SimpleMatrix class 繼承自此基礎 class 並將int作為通用參數傳遞。
  • 創建一個繼承自此基礎 class 的ComplexMatrix class 並將Complex作為通用參數傳遞。

你不能真正做你想做的事。

問題是 C# 中的所有數字類型都沒有超類。 因此,在這樣的 class 層次結構中,您不能真正用一種數字類型替換另一種數字類型(並且仍然對它們進行數學運算)。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM