Почему мы не можем использовать модификатор доступа в методах класса, реализующего два интерфейса, состоящих из одинаковых методов?

      public interface A
{
     void FirstDemo();
     void SecondDemo();
}
public interface B
{
     void FirstDemo();
     void SecondDemo();
}

 public class Demo : A, B
        {
            void A.FirstDemo()
            {
                Console.WriteLine("This is a function of first method of interface A");
            }
            void A.SecondDemo()
            {
                Console.WriteLine("This is a function of second method of interface A");
            }

            void B.FirstDemo()
            {
                Console.WriteLine("This is a function of first method of interface B");
            }
            void B.SecondDemo()
            {
                Console.WriteLine("This is a function of second method of interface B");
            }
        }

static void Main(string[] args)
        {
            A obj = new Demo();
            obj.SecondDemo();
            B obj1 = new Demo();
            obj1.FirstDemo();
        }

Эта программа работает исправно. Но мое замешательство в том, что если я реализую только один интерфейс в классе Demo, то я могу указать модификатор доступа в каждом методе этого интерфейса. Но когда я пытаюсь реализовать оба интерфейса (в данном случае: A и B), которые состоят из одних и тех же методов в одном классе (в данном случае: демонстрационный класс), мне не разрешается использовать модификатор общего доступа. почему это происходит?

Примечание . Если я использую единый интерфейс и реализую его в классе Demo , тогда я могу использовать модификатор доступа ко всем методам, объявленным в интерфейсе. Так в чем же проблема в нескольких интерфейсах с одинаковыми методами?

2 ответа

Различие заключается не столько в «1 интерфейсе против 2 интерфейсов», сколько в «неявной и явной реализациях интерфейса». Объяснение части вопроса «почему модификатор видимости запрещен» я отнесу к вопросу Почему в С# нужно упоминать модификатор доступа для реализации свойства интерфейса?.

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

C# позволяет реализовать один интерфейс как явно, так и неявно, и они становятся разными методами. Статический тип объекта определяет, какой метод вызывать:

      interface IFace {
  void Method();
  void OnlyImplicit();
  void OnlyExplicit();
}

public class Obj : IFace {
  public void Method() {
    Console.WriteLine("implicit implementation");
  }

  void IFace.Method() {
    Console.WriteLine("explicit implementation");
  }

  public void OnlyImplicit() {
    Console.WriteLine("only implemented implicitly");
  }

  void IFace.OnlyExplicit() {
    Console.WriteLine("only implemented explicitly");
  }

  public void Main() {
    Obj o = new Obj(); // or: var o = new Obj();
    IFace i = o;

    o.Method(); // call of implicit impl
    i.Method(); // call of explicit impl

    o.OnlyImplicit(); // call of implicit impl
    i.OnlyImplicit(); // call of implicit impl

    i.OnlyExplicit(); // call of explicit impl

    // compile error, method is implemented explicitly,
    // can only be called when static type is interface;
    // cannot be called when static type is the class' type
    // (this is not so obvious):
    o.OnlyExplicit();
  }
}

Чтобы использовать объект, вам нужен интерфейс :-).

Вы можете реализовать один интерфейс неявно, а другой явно.

Вы не можете предоставить несколько разных реализаций одного и того же метода интерфейса. Иначе как компилятор выберет реализацию для использования?

Предположим, вы неявно реализуете A и явно B:

      var demo = new Demo();
demo.FirstDemo(); // it uses public implementation (Demo class interface) that is A
var demoB = (B)demo;
demoB.FirstDemo(); // it uses B interface
Другие вопросы по тегам