Math.net如何创建通用ToString()覆盖
本文关键字:ToString 覆盖 net 何创建 Math 创建 | 更新日期: 2023-09-27 18:23:42
Math.net为大多数数据集合提供了ToString()
实现。在类中使用时,需要重写这些。我知道如何对一个变量执行此操作,但如何使其对同一类型的所有变量通用?
我的类定义有一个变量ToString()
覆盖:
public class Network
{
public Matrix<double> Win { get; set; } // network input matrix
public Matrix<double> Wres { get; set; } // network reservoir matrix
public Matrix<double> Wout { get; set; } // network output matrix
// constructor
public Network(Matrix<double> Winput, Matrix<double> Wreservoir, Matrix<double> Woutput)
{
Win = Winput;
Wres = Wreservoir;
Wout = Woutput;
}
public override string ToString()
{
return Win.ToString();
}
}
这在具有类似Console.WriteLine(network.Win.ToString());
的调用的Win
上起作用,但如何输出其他矩阵Wres
、Wout
(具有不同维度)?我试图创建三个覆盖,但由于编译器抱怨,这三个覆盖都不起作用:
已经使用相同的参数定义了名为"ToString"的成员类型
此外,我相信一定有一种更通用、更优雅的方法来做到这一点。
您已经在Network
类中将每个Matrix
创建为公共属性,因此您可以在需要时简单地访问它们。
Network network = new Network(mInput, mResevoir, mOutput);
Console.WriteLine(network.Win);
Console.WriteLine(network.Wres);
Console.WriteLine(network.Wout);
编辑:我刚刚意识到属性也有一个公共集合方法。如果您不希望在创建Network变量后更改属性,可以将setter修改为private,因此只能在类中使用se值。
public class Network
{
public Matrix<double> Win { get; private set; } // network input matrix
public Matrix<double> Wres { get; private set; } // network reservoir matrix
public Matrix<double> Wout { get; private set; } // network output matrix
// constructor
public Network(Matrix<double> Winput, Matrix<double> Wreservoir, Matrix<double> Woutput)
{
Win = Winput;
Wres = Wreservoir;
Wout = Woutput;
}
public override string ToString()
{
return Win.ToString();
}
}
您创建的ToString()
方法适用于Network
类。。。
换句话说,您已经使调用Network.ToString()
成为字符串化的Win矩阵。当然,Network.ToString()
不可能有三种不同的行为——那么你希望它做什么呢?
我认为您的问题试图覆盖网络类上所有矩阵字段的network.matrix.ToString()
行为。。。在这种情况下,有必要覆盖Matrix类本身的行为,为此,您需要使Matrix<double>
的Win
、Wres
和Wout
子类具有自己的ToString()
覆盖,如下所示:
public class Network
{
public NetworkMatrix Win { get; set; } // network input matrix
public NetworkMatrix Wres { get; set; } // network reservoir matrix
public NetworkMatrix Wout { get; set; } // network output matrix
// constructor
public Network(NetworkMatrix Winput, NetworkMatrix Wreservoir, NetworkMatrix Woutput)
{
Win = Winput;
Wres = Wreservoir;
Wout = Woutput;
}
...
}
public class NetworkMatrix : Matrix<double>
{
public override string ToString()
{
return "Overwridden tostring method.";
}
}
然而,根据构造函数的馈送方式,这可能无法发送派生类型。此外,我还没有使NetworkMatrix
通用,但如果你愿意,你可以做NetworkMatrix<T> : Matrix<T>
。
说了这么多——我应该指出,调用类似network.Win.ToString()
的东西通常是糟糕的编码实践——其他类不应该知道网络的内部,否则就会遇到问题。查德米特定律https://en.wikipedia.org/wiki/Law_of_Demeter)了解更多信息。(特别值得一问的是,Win
、Wres
甚至Wout
是否应该首先公开?)
最好的方法是使用Network.ToString()
方法的覆盖,以合理的方式组合Win、Wres或Wout的数据。或者创建一个矩阵字符串生成器类,它可以按照您想要的方式格式化字符串。
希望这会有所帮助。任何问题都可以问。