Перегрузка конструктора в C # (используется это ключевое слово) - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь выучить C # и немного застрял в проблеме.Вероятно, очевидно для большинства опытных программистов, но не для меня: (

Я пытаюсь написать класс, который должен иметь 3 перегрузки конструктора:

  • Я указываю толькопапка.
  • Я указываю папку и тип файла (расширение файла).
  • Я указываю папку, тип файла и да / нет для поиска в подпапке.

В зависимости от спецификации пользователя класс возвращает List.

Итак, я написал следующий код:

public class SearchForFiles
{
    private readonly List<string> _filePath = new List<string>();
    private readonly List<string> _fileType = new List<string>();
    private readonly bool _searchSubFolder = false;
    private SearchOption _searchOption = SearchOption.TopDirectoryOnly;
    private readonly IEnumerable<string> _searchForFiles = null;

   /// <summary>
    /// Searching all the files in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    public SearchForFiles(string searchFolder)
    {
        _filePath.Add(searchFolder);
        _fileType.Add(".*");
        FindFiles(_filePath, _fileType, false);
    }

    /// <summary>
    /// Searching all the files with the specified file extension in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    /// <param name="fileType">Specify extension of the file search</param>
    public SearchForFiles(string searchFolder, string fileType)
        : this(searchFolder)
    {
        _fileType.Add(fileType);
        FindFiles(_filePath, _fileType, false);
    }

    public SearchForFiles(List<string> searchFolder, List<string> fileType, bool searchSubFolder)
        : this(searchFolder, fileType)
    {
        _searchSubFolder = searchSubFolder;
        FindFiles(_filePath, _fileType, _searchSubFolder);
    }

Проблема заключается в третьей перегрузке, я не понимаю, почемусо второй перегрузкой все в порядке, но не с третьей.

Если кто-нибудь может мне помочь, это было бы здорово.

Вот обновленный Код, который работает:

/// <summary>
/// Returning a list of files depending on the user choices.
/// </summary>
public class SearchForFiles
{
    private readonly List<string> _filePath = new List<string>();
    private readonly List<string> _fileType = new List<string>();
    private readonly bool _searchSubFolder = false;
    private SearchOption _searchOption = SearchOption.TopDirectoryOnly;
    private IEnumerable<string> _searchForFiles = null;

    /// <summary>
    /// Searching all the files with the specified file extension(s) in the specified folder(s) and sub folder(s) if wanted.
    /// </summary>
    /// <param name="searchFolder">Specify folder(s) for file(s) search</param>
    /// <param name="fileType">Specify file extension(s) for the search</param>
    /// <param name="searchSubFolder">Specify if you want to search in sub folder(s)</param>
    public SearchForFiles(List<string> searchFolder, List<string> fileType, bool searchSubFolder)
    {
        _filePath = searchFolder;
        _fileType = fileType;
        _searchSubFolder = searchSubFolder;
        FindFiles();
    }

    /// <summary>
    /// Searching all the files with the specified file extension in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    /// <param name="fileType">Specify file extension for the search</param>
    public SearchForFiles(string searchFolder, string fileType)
        : this(new List<string>() {searchFolder}, new List<string>() {fileType}, false)
    {

    }

    /// <summary>
    /// Searching all the files in the specified folder.
    /// </summary>
    /// <param name="searchFolder">Specify folder for file search</param>
    public SearchForFiles(string searchFolder)
        : this(new List<string>() {searchFolder}, new List<string>(), false)
    {

    }

    private List<string> FindFiles()
    {
        var findFiles = new List<string>();

        if (_searchSubFolder == true)
            _searchOption = SearchOption.AllDirectories;

        foreach (var filePath in _filePath)
        {
            if (_fileType.Count == 0)
            {
                _searchForFiles = Directory.EnumerateFiles(filePath, "*.*", _searchOption);
            }
            else
            {
                _searchForFiles = Directory.EnumerateFiles(filePath, "*.*", _searchOption).Where(e => _fileType.Contains(new FileInfo(e).Extension, StringComparer.OrdinalIgnoreCase));
            }

            foreach (var file in _searchForFiles)
            {
                findFiles.Add(file);
            }
        }

        return findFiles;
    }
}

Большое спасибо за все подсказки и ответы:)

1 Ответ

0 голосов
/ 30 сентября 2018

@ CrazyNoun, Как @ D-Shih сказал, вы должны сначала исправить проблему несоответствия типов.и о Конструкторах: Перегрузка Конструктора может быть реализована для достижения одной цели несколькими способами (например, Перегрузка MessageBox.Show () в форме окон), и она может быть реализована для достижения нескольких целей несколькими способами (например, Перегрузки Convert.ToString ()).

Вы хотите достичь одной цели.таким образом, мы должны определить значения по умолчанию .Ваши объявления в порядке Обратный .на самом деле вы должны определить что-то вроде этого:

public class SearchForFiles
{
     public SearchForFile(List<string> searchFolder, List<string> fileType, bool searchSubFolder)
     {
         _searchSubFolder = searchSubFolder;
         FindFiles(searchFolder, fileType, searchSubFolder);
     }

     public SearchForFiles(string searchFolder, string fileType):this(new List<string>(){searchFolder}, new List<string>(){fileType}, false)
     {

     }

     public SearchForFiles(string searchFolder):this(new List<string>(){searchFolder}, new List<string>(), false)
     {

     }

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

...