Общедоступные элементы в реализации интерфейса

#c# #interface

#c# #интерфейс

Вопрос:

У меня есть этот интерфейс и класс, реализующий его:

 interface Scraper
{
    string DateToUrl(DateTime date);
}

class ScraperA: Scraper
{
    string Scraper.DateToUrl(DateTime date)
    {
        return "some string based on date";
    }
}
  

Я бы хотел это протестировать. Я пытаюсь добавить этот метод в ScraperA :

     public void JustATest()
    {
        DateTime date = new DateTime(2011, 5, 31);
        string url = DateToUrl(date);
        Console.WriteLine(url);
    }
  

Я включил это в определение класса, но компилятор жалуется, что не может найти DateToUrl . Почему?

Ответ №1:

Добавляя к имени метода префикс с Scraper в объявлении, вы явно реализуете интерфейс.

Это означает, что метод по существу невидим, если он не вызывается через Scraper интерфейс.

Ваши варианты:

  1. Удалите Scraper префикс в объявлении. Затем метод может быть вызван обычным образом:

     public string DateToUrl(DateTime date)
    {
        return "some string based on date";
    }
      
  2. Приведите свой экземпляр к интерфейсу перед вызовом метода:

     public void JustATest()
    {
        DateTime date = new DateTime(2011, 5, 31);
        string url = ((Scraper)this).DateToUrl(date);
        Console.WriteLine(url);
    }
      

Комментарии:

1. Я выбрал первый вариант, но мне пришлось сделать DateToUrl реализацию общедоступной, чтобы она работала (потому что, по-видимому, методы интерфейса являются общедоступными по умолчанию).

Ответ №2:

Удалите часть «Scraper» из «Scraper.DateToUrl»:

 interface Scraper
{
    string DateToUrl(DateTime date);
}

class ScraperA: Scraper
{
    string DateToUrl(DateTime date)
    {
        return "some string based on date";
    }
}
  

Комментарии:

1. Теперь я получаю ошибку, которая ScraperA не реализует все методы из своего интерфейса.

2. Но это так. Есть ли что-то еще в интерфейсе или классе, чего вы нам не показываете?