Конструктор цепочки - PullRequest
       13

Конструктор цепочки

0 голосов
/ 27 сентября 2011

У меня есть следующий код:

    public MapReader(string fName) {
        FileName = fName;
    }

    public MapReader(){
        Console.WriteLine("Input valid file name:");
        string name = Console.ReadLine();
        this(name);
    }

По-видимому, это подход Java, который не работает в C #. Есть ли опция, которая не требует добавления метода для инициализации?

Ответы [ 6 ]

3 голосов
/ 27 сентября 2011

Вы не можете сделать это в C #.Вам нужно будет установить свойство в другом конструкторе.

В идеале вы должны отделить зависимость от консоли.

2 голосов
/ 27 сентября 2011

Хотя я согласен с другими, что наличие зависимости от консоли, вероятно, не лучше для этого класса, это будет работать:

class MapReader
{
    public string FileName { get; private set; }
    public MapReader(string fName)
    {
        FileName = fName;
    }

    public MapReader() : this(ObtainNameFromConsole())
    {

    }

    private static string ObtainNameFromConsole()
    {
        Console.WriteLine("Input valid file name:");
        return Console.ReadLine();
    }
}
2 голосов
/ 27 сентября 2011

В C # вы не можете использовать этот подход.
Попробуйте это:

private void setParam(string name) {
    FileName = name;
}

public MapReader(string fName) {
    setParam(fName);
}

public MapReader() {
    Console.WriteLine("Input valid file name:");
    string name = Console.ReadLine();
    setParam(name);
}
0 голосов
/ 27 сентября 2011

Вы можете сделать это:

public MapReader(string fName) {
   if (fName == null)
   {
     Console.WriteLine("Input valid file name:");
     fName = Console.ReadLine();
    }
    FileName = fName;
}

public MapReader() : this (null) {}
0 голосов
/ 27 сентября 2011

Мне не очень нравится подход с таким конструктором побочных эффектов, вы можете симулировать то же самое, как это:

public class MapReader
{
    private string fileName;

    private MapReader(Func<string> fileName)
    {
        this.fileName = fileName();
    }

    public MapReader(string fileName) : this(() => fileName)
    {
    }

    public MapReader() : this(() => 
        {
            Console.WriteLine("Input valid file name:");
            return Console.ReadLine();
        })
    {
    }
}
0 голосов
/ 27 сентября 2011

Может как то так?

public MapReader(string fName)
{
    FileName = fName;
}

public static MapReader FromConsole()
{
    Console.WriteLine("Input valid file name:");
    string name = Console.ReadLine();
    return new MapReader(name);
}
...