如何解决从基类继承ToString时,数据类型混乱
|| 我正在用C#语言编写一个用于处理矩阵的类库,并且目前正在处理名为ComplexMatrix的Matrix子类。 Matrix基类使用Int32数据类型(更高级的版本使用Double)和System.Numerics.Complex结构(.NET 4)的ComplexMatrix的值。 对于基类,我将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类编写的原始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属性:在Matrix类中,这是Int32类型的二维数组(在较新的,更高级的版本中为Double);它是ComplexMatrix中的System.Numerics.Complex类型
this.Rows,this.Columns属性:矩阵的行数和列数
我有几个问题:
当在ComplexMatrix实例上调用ToString并调用基本的ToString()方法时,是否尝试将类型从Complex转换为Int32?
当ComplexMatrix Elements属性(Complex [,]类型)隐藏基类Elements属性(Int32 [,]类型)时,需要new关键字吗?
是将“ this”这个kwyword视为Matrix类型而不是ComplexMatrix吗?
解决方法
我认为您的问题如下:
Matrix
类中的Elements
属性未标记为virtual
。 ComplexMatrix
类中的Elements
属性隐藏Matrix
类中的Elements
属性。因此多态性不起作用,并且Matrix
中的ToString
方法访问Matrix.Elements
而不是ComplexMatrix.Elements
。但是由于ѭ5是一个属性,并且您想更改属性的类型,所以无论如何都不能使用virtual
。
要解决此问题,您应该执行以下操作:
创建一个通用基类,该基类希望将矩阵值的类型作为通用参数
创建一个继承自此基类的SimpleMatrix
类,并将int
作为通用参数传递。
创建一个继承自此基类的ComplexMatrix
类,并将passes21ѭ作为通用参数传递。
, 您实际上无法做您想做的事情。
问题是C#中没有所有数字类型的超类。因此,您无法在这样的类层次结构中真正地用一种数字类型替换另一种数字类型(并且仍然对它们进行数学运算)。
您可以做的是创建一个IMatrixElement接口。然后创建实现该接口的具体类MatrixElementInt,MatrixElementDouble,MatrixElementComplex。然后在构建矩阵时提供正确的元素类型。
interface IMatrixElement
{
IMatrixElement Add(IMatrixElement a,IMatrixElement b);
IMatrixElement Multiply(IMatrixElement a,IMatrixElement b);
string ToString();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。