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上起作用,但如何输出其他矩阵WresWout(具有不同维度)?我试图创建三个覆盖,但由于编译器抱怨,这三个覆盖都不起作用:

已经使用相同的参数定义了名为"ToString"的成员类型

此外,我相信一定有一种更通用、更优雅的方法来做到这一点。

Math.net如何创建通用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>WinWresWout子类具有自己的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)了解更多信息。(特别值得一问的是,WinWres甚至Wout是否应该首先公开?)

最好的方法是使用Network.ToString()方法的覆盖,以合理的方式组合Win、Wres或Wout的数据。或者创建一个矩阵字符串生成器类,它可以按照您想要的方式格式化字符串。


希望这会有所帮助。任何问题都可以问。