繁体   English   中英

Math.net如何创建通用的ToString()覆盖

[英]Math.net how to create generic ToString() override

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();
    }
}

这在Win可以通过Console.WriteLine(network.Win.ToString());类的调用来工作Console.WriteLine(network.Win.ToString()); 但是如何输出其他矩阵WresWout (具有不同尺寸)? 我尝试创建三个替代,但是由于编译器抱怨而无法正常工作:

已经使用相同的参数类型定义了一个名为“ ToString”的成员

此外,我相信必须有一种更通用,更优雅的方式来做到这一点。

您已经在Network类中将每个Matrix创建为公共属性,因此您可以在需要时直接访问它们。

Network network = new Network(mInput, mResevoir, mOutput);

Console.WriteLine(network.Win);
Console.WriteLine(network.Wres);
Console.WriteLine(network.Wout);

编辑:我刚刚意识到属性也有一个公共设置方法。 如果您不希望在创建Network变量后更改属性,则可以将设置器修改为私有的,因此只能从类内部获取值。

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()拥有三种不同的行为-那么您希望它做什么?

认为您的问题旨在针对网络类上的所有Matrix字段覆盖network.matrix.ToString()的行为...在这种情况下,有必要覆盖Matrix类本身的行为,为此, d需要使用自己的ToString()重写Matrix<double> WinWresWout子类,如下所示:

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()类的代码通常是较差的编码实践-其他类不应该了解网络的内部结构,因此会遇到问题。 查找Demeter法则(例如https://en.wikipedia.org/wiki/Law_of_Demeter )以获取更多信息。 (尤其值得一提的是, WinWres甚至Wout是否应该公开?)

最好的方法是使用对Network.ToString()方法的重写以明智的方式组合Win,Wres或Wout上的数据。 或创建一个矩阵字符串分类器类,该类可以按所需的方式格式化字符串。


希望对您有所帮助。 有任何问题,只问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM