#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
интерфейс.
Ваши варианты:
-
Удалите
Scraper
префикс в объявлении. Затем метод может быть вызван обычным образом:public string DateToUrl(DateTime date) { return "some string based on date"; }
-
Приведите свой экземпляр к интерфейсу перед вызовом метода:
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. Но это так. Есть ли что-то еще в интерфейсе или классе, чего вы нам не показываете?