Почему мы не можем использовать модификатор доступа в методах класса, реализующего два интерфейса, состоящих из одинаковых методов?
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