Задать вопрос
@SaddledSharp
Кодер. Увлекаюсь информационной безопасностью.

C#. Тип «Settings» уже определяет член «Save» с такими же типами параметрами. Что делать?

Всем привет
Вообщем у меня есть функция Save() которая сохраняет параметры в файл и обновляет их.
Но мне нужно её перегрузить, то есть в некоторых местах сохранить ТОЛЬКО один параметр из трёх. Или два параметра из трёх.
Код:

class Settings
    {
        public string Macros_Directory { get; set; }
        public string SteamID { get; set; }
        public string AccPath { get; set; }

        public Settings()
        {
            string stId = "";
            string macDirectory = "";
            string account_path = "";

            try
            {
                StreamReader sr = new StreamReader("**");
                stId = sr.ReadToEnd().Trim();
                sr.Close();
            }
            catch (Exception) { }

            try
            {
                StreamReader sr = new StreamReader("**");
                macDirectory = sr.ReadToEnd().Trim();
                sr.Close();
            }
            catch (Exception) { }

            try
            {
                StreamReader sr = new StreamReader("**");
                account_path = sr.ReadToEnd().Trim();
                sr.Close();
            }
            catch (Exception) { }

            if (macDirectory.Trim() != "" && stId.Trim() != "" && account_path.Trim() != "")
            {
                Macros_Directory = macDirectory;
                SteamID = stId;
                AccPath = account_path;
            }
            else
            {
                Macros_Directory = "";
                SteamID = "";
                AccPath = "";
            }
        }
        public void Save(string macDir, string steamid, string accpath)
        {
            StreamWriter stid = new StreamWriter("**");
            stid.WriteLine(steamid);
            stid.Close();

            StreamWriter macD = new StreamWriter("**");
            macD.WriteLine(macDir);
            macD.Close();

            StreamWriter accPath = new StreamWriter("**");
            accPath.WriteLine(accpath);
            accPath.Close();

            Macros_Directory = macDir;
            SteamID = steamid;
            AccPath = accpath;
        }
        public void Save(string accpath)
        {
            StreamWriter accPath = new StreamWriter("**");
            accPath.WriteLine(accpath);
            accPath.Close();

            AccPath = accpath;
        }
        public void Save(string macDir) // Тип "Settings" уже определяет член "Save" с такими же типами параметрами
        {                                  // ERROR
            StreamWriter macD = new StreamWriter("**");
            macD.WriteLine(macDir);
            macD.Close();
            
            Macros_Directory = macDir;
        }
    }

Я пометил проблему комментарием.
Как правильно перегрузить функции?
Вроде базовые C# знаю, а забыл...Думал класс создать, но что то вообще каша была бы.
  • Вопрос задан
  • 587 просмотров
Подписаться 2 Простой 9 комментариев
Решения вопроса 1
@kttotto
пофиг на чем писать
При перегрузке методы должны отличаться сигнатурой - отличаться типом или кол-вом входящих параметров. Если при вызове метода Save Вы всегда знаете какой параметр или параметры хотите сохранить, то в Вашем случае я вижу два варианта:
первый, если таких перегрузок требуется два-три, то каждый метод можно назвать по другому, например SaveMacDir, SaveAccpath и т.д.
второй, если этих парметров три, то два из них сделать необязательными
public void Save(string accpath, string macDir = null, string stId = null)
{
	try
	{
		using(var sw = new StreamWriter("**"))
		{
			if(!string.IsNullOrEmpty(accpath))
			{
				sw.WriteLine(accpath);
				AccPath = accpath
			}
			if(!string.IsNullOrEmpty(macDir))
			{
				sw.WriteLine(macDir);
				Macros_Directory  = macDir;
			}
			if(!string.IsNullOrEmpty(stId))
			{
				sw.WriteLine = stId;
				SteamID = stId;
			}
		}
	}
	catch(Exception ex) { }
}

И вызывать их как
Save(accpath)
Save(accpath, macDir)
Save(accpath, macDir, stId)
Save(null, macDir, stId)
Save(accpath, null, stId)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
virtual_hack2root
@virtual_hack2root
.NET Core, JS, DevOps
Вам можно использовать шаблон стратегия и фасад, но для 3 параметров, это избыточно,
лучшим решением будет отказаться от перегрузки функции Save, и применить рефакторинги переноса кода метода в другой класс, для всех перегрузок Save, по классу на перегрузку, и дать более специфическое имя для метода Save в основном классе

public interface IStreamSourceWriter: IDisposable {
  WriteLine(string);  
}
public void SaveFromSource(IStreamSourceWriter streamSourceWriter) {
  // код ниже уходит в реализацию паттерна интерфейс, то есть в IStreamSourceWriter)
  // управление временем жизни уходит в реализацию паттерна
  // using(StreamWriter stid = new StreamWriter("**");
  // stid.WriteLine(steamid);
  // stid.Close();   
  streamSourceWriter.WriteLine(steamid);
}
public void SaveFromSources(IEnumerable<IStreamSourceWriter> streamSourceWriters) { 
  foreach(source in streamSourceWriters) {
    SaveFromSource(source);
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы