2015-11-21 6 views
1

Math.net имеет ToString() реализации для большинства коллекций данных. При использовании в классах они должны быть переопределены. Я знаю, как это сделать для одной переменной, но как сделать ее обобщенной для всех переменных одного и того же типа?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

Вы хотите один метод, который преобразует все три матрицы в строковое представление? Вы можете просто вернуть это в свой переопределенный метод ToString. –

+0

Ларс, я хочу иметь возможность выводить любую из трех матриц с помощью оператора 'WriteLine', как показано в моем вопросе. Можете ли вы показать/объяснить, что вы предлагаете? – jdelange

+0

Это? 'return Win.ToString() + Wres.ToString() + Wout.ToString()' –

ответ

2

Вы уже создали каждый Matrix в качестве общего свойства в классе Network, поэтому вы можете просто получить к ним доступ, когда вам нужно.

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

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

Редактировать: Я просто понял, что свойства также имеют общедоступный метод набора. Если вы не хотите, чтобы свойства были изменены после того, как была создана переменная сети, вы можете изменить настройки, чтобы они были закрытыми, поэтому значения могут быть получены только внутри класса.

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

Действительно 'Console.WriteLine (network.Wres);' например, за которым следует 'Console.WriteLine (network.Win);' работает. Таким образом, в этом случае нет необходимости в переопределении 'ToString()'. «частный набор» - тоже хорошая заметка. – jdelange

0

ToString() метода, который вы создали работу по Network классу ...

Других слов, вы сделали вызов Network.ToString() быть stringifyed Win матрицей. Естественно, вы не можете иметь три разных поведения для Network.ToString() - так что бы вы хотели сделать?

Я думаю вашего вопроса стремится переопределить поведение network.matrix.ToString() для всех матричных полей на классе сети ... В этом случае, необходимо переопределить поведение на самой матрице класса, чтобы сделать это, вы» d нужно сделать 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 разумным образом. Или создайте класс строкового разделителя, который может форматировать строки так, как вы хотите.


Надеюсь, это полезно. Любые вопросы, просто спросите.

+0

Дэвид, хорошо посоветуйте. Необходимо некоторое время переварить это. В этом конкретном случае предложение Ларса работает. – jdelange

+0

Хорошо, фантастично :). Думаю, я неправильно понял ваш вопрос, извините за путаницу. –

Смежные вопросы