Перегрузки функций с использованием интерфейсов и явных реализаций - PullRequest
1 голос
/ 13 июня 2011

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

   public interface Iface
   {
      void Sample1();
      void Sample1(bool value);
   }

И реализация показана ниже.Примечание: требуется, чтобы реализация Sample1 была явной (из-за общих ограничений voodoo)

   public class myCLass : Iface
   {
      void Iface.Sample1()
      {
         this.Sample1(true);
      }
      void Iface.Sample1(bool value)
      {
      }
   }

Попытка вызвать перегрузку, однако, приводит к этой ошибке:

Ошибка 5 'myCLass'не содержит определения для 'Sample1' и не может быть найден метод расширения 'Sample1', принимающий первый аргумент типа 'myCLass' (отсутствует директива using или ссылка на сборку?) Q: \ common \ VisualStudio \ Charting \Drilldowns.cs 18 15 Диаграммы

Итог: я думаю, что не уверен в синтаксисе, который мне следует использовать для вызова «другой» перегрузки в том же интерфейсе.

Ответы [ 3 ]

3 голосов
/ 13 июня 2011

Явные реализации интерфейса не являются открытыми методами.
Вы можете вызвать их только путем приведения к интерфейсу:

((IDrilldown)this).Sample1(true);
3 голосов
/ 13 июня 2011

Поскольку вы реализуете интерфейс явно , вам необходимо привести себя к интерфейсу:

((IDrilldown)this).Sample1(true);

Или, если вам не нравится встроенный актерский состав:

IDrilldown idd = (IDrilldown)this;
idd.Sample1(true);

Если бы вы делали нормальную неявную реализацию, вы могли бы вызывать метод напрямую. Явные реализации интерфейса могут использоваться только для переменной, специально определенной для этого интерфейса.

0 голосов
/ 13 июня 2011

Я думаю, что ваш код испортился из-за переименования, или в нем есть какой-то код, который не был включен в вопрос (DFResults, IDrilldown).Я предполагаю, что DFResults должен быть MyClass, а IDrilldown должен быть Iface.

Итак, у вас есть интерфейс IFace, который объявляет 2 метода.У вас есть класс, который реализует интерфейс, и ЯВНО реализует этот интерфейс.Кажется, вы соглашаетесь с тем, что он должен быть явным, но при этом вы не можете вызывать метод через класс, только приведя к интерфейсу.

public interface IFace
{
   void SampleFunc();
}

public class MyClass : IFace
{
   void IFace.SampleFunc();
}

public static void Program()
{
   MyClass instance = new MyClass();
   instance.SampleFunc(); //Illegal
   ((IFace)instance).SampleFunc(); Legal
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...