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());
之类的调用,但如何输出其他矩阵Wres
,Wout
(具有不同的维度)?我试图创建三个覆盖,但这不起作用,因为编译器抱怨:
已经使用相同的参数定义了一个名为'ToString'的成员 类型
此外,我确信必须有更通用和更优雅的方式来做到这一点。
答案 0 :(得分:2)
您已在Matrix
课程中将每个Network
创建为公共媒体资源,因此您可以在需要时轻松访问它们。
Network network = new Network(mInput, mResevoir, mOutput);
Console.WriteLine(network.Win);
Console.WriteLine(network.Wres);
Console.WriteLine(network.Wout);
编辑:我刚刚意识到属性也有一个公共集方法。如果您不希望在创建网络变量后更改属性,则可以将setter修改为private,因此值只能来自类中。
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();
}
}
答案 1 :(得分:0)
您创建的ToString()
方法适用于Network
类...
换句话说,你已经将Network.ToString()
作为字符串化的Win矩阵。当然,Network.ToString()
你不能有三种不同的行为 - 所以你想要它做什么?
我认为你的问题试图覆盖网络类上所有Matrix字段的network.matrix.ToString()
行为......在这种情况下,有必要覆盖Matrix类的行为要做到这一点,您需要使用Win
替换Wres
,Wout
和Matrix<double>
子类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上的数据。或者创建一个矩阵字符串化类,它可以按照你想要的方式格式化字符串。
希望这有帮助。有问题,请问。