Есть много ответов, и все они правы, поскольку явная реализация интерфейса - это решение вашей проблемы.
Я попытаюсь прояснить мотивы этого дизайна на несколько запутанном примере.:
Допустим, у меня есть интерфейс для людей, которые работают (с возможными реализациями, такими как LongDistanceRunner
, Jogger
, MarathonMan
и т. Д.)
public interface IRunner
{
void Run();
}
и интерфейс для устройствкоторые можно включить и запустить (с возможными реализациями BathTub
, Application
, Dishwasher
и т. д.)
public interface IRunnable
{
void Run();
}
Теперь я хочу создать и интерфейс для IMusicallJogger
(реализации, подобные JoggerWithIpod
, BoomBoxJogger
и т. Д.)
public interface IMusicalJogger : IRunner, IRunnable {}
public class BoomBoxJogger : IMusicalJogger
{
// code here
}
BoomBoxJogger bbJogger = new BoomBoxJogger();
Теперь, когда я говорю bbJogger.Run()
, что должен делать мой объект?Должен ли он начать бегать по парку, или включить бумбокс, или оба, или что-то еще полностью?Если я реализую и класс, и место вызова, может быть очевидно, что I хочет, чтобы мои бегуны делали и то и другое, но что, если я контролирую только место вызова?А что, если есть другие реализации интерфейса, которые делают что-то еще?А что, если мой бегун начинает бегать по парку, когда он используется в контексте, где он рассматривается как устройство (посредством приведения).
Вот где вступает в игру явная реализация интерфейса.
Я должен определить свой класс следующим образом:
public class BoomBoxJogger : IMusicalJogger
{
void IRunner.Run() //implementation of the runner aspect
{
Console.WriteLine("Running through the park");
}
void IRunnable.Run() //implementation of the runnable aspect
{
Console.WriteLine("Blasting out Megadeth on my boombox");
}
public void Run() //a new method defined in the class itself
{
Console.WriteLine("Running while listening to music");
}
}
, а затем, когда я звоню, я должен указать, какой аспект моего бегуна я хочу использовать:
BoomBoxJogger bbJogger = new BoomBoxJogger();
((IRunner).bbJogger).Run(); // start running
((IRunnable).bbJogger).Run(); // blast the boombox
//and of course you can now do
bbJogger.Run //running while listening
((IMusicalJogger)jogger).Run(); //compiler error here, as there is no way to resolve this.
Надеюсь, я помог уточнить концепцию.