[英]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());
但是如何输出其他矩阵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变量后更改属性,则可以将设置器修改为私有的,因此只能从类内部获取值。
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>
Win
, Wres
和Wout
子类,如下所示:
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 )以获取更多信息。 (尤其值得一提的是, Win
, Wres
甚至Wout
是否应该公开?)
最好的方法是使用对Network.ToString()
方法的重写以明智的方式组合Win,Wres或Wout上的数据。 或创建一个矩阵字符串分类器类,该类可以按所需的方式格式化字符串。
希望对您有所帮助。 有任何问题,只问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.