Два идентичных по классу метода с разными модификаторами доступа и интерфейсом

#c# #.net

#c# #.net

Вопрос:

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

 using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }

    interface IMyInterface
    {
        void MyMethod();
    }

    class MyClass : IMyInterface
    {
        public void MyMethod()
        {
            Console.WriteLine(1);
        }

        void IMyInterface.MyMethod() //No error
        {
            Console.WriteLine(1);
        }
    }

    class MyOtherClass
    {
        public void MyOtherMethod()
        {
            Console.WriteLine(1);
        }

        void MyOtherMethod() //Error CS0111
        {
            Console.WriteLine(1);
        }
    }
}
 

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

1. docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… Метод, зависящий от интерфейса, недоступен в классе, а метод, зависящий от класса, недоступен в интерфейсе, поэтому вы увидите разное поведение в зависимости от того, обращаетесь ли вы к экземпляру как к экземпляру класса или к экземпляру интерфейса.

2. В одном классе вы реализуете интерфейс, что означает, что существует локальная версия и интерфейсная версия метода. В другом случае вы пытаетесь объявить один и тот же метод с разными модификаторами, что невозможно, поскольку он находится в том же классе, и компилятор не будет знать разницы.

3. К Алику. Спасибо. Теперь понятно. В MyClass это на самом деле разные методы, как вы сказали.

4. void IMyInterface.MyMethod() является явной реализацией интерфейса. Вы можете думать о нем так, как будто он принадлежит не классу, а интерфейсу — и он доступен только в том случае, если вашим ссылочным типом является сам интерфейс.