Aquí está la diferencia en la llanura Inglés:
Suponga que tiene una interfaz Machine
, que tiene una función Run()
, y otra interfaz Animal
que también tiene una función llamada Run()
. Por supuesto, cuando una máquina funciona, estamos hablando de que está comenzando, pero cuando un animal corre, estamos hablando de que se mueve. Entonces, ¿qué sucede cuando tienes un objeto, vamos a llamarlo Aibo
que es a la vez y Animal
? (Aibo es un perro mecánico, por cierto). Cuando se ejecuta Aibo
, ¿se inicia o se mueve? Explícitamente la implementación de una interfaz le permite hacer esta distinción:
interface Animal
{
void Run();
}
interface Machine
{
void Run();
}
class Aibo : Animal, Machine
{
void Animal.Run()
{
System.Console.WriteLine("Aibo goes for a run.");
}
void Machine.Run()
{
System.Console.WriteLine("Aibo starting up.");
}
}
class Program
{
static void Main(string[] args)
{
Aibo a = new Aibo();
((Machine)a).Run();
((Animal)a).Run();
}
}
El truco aquí es que no puedo simplemente llamar a.Run()
porque mis dos implementaciones de la función están unidas de forma explícita a una interfaz. Eso tiene sentido, porque de lo contrario, ¿cómo sabría el recopilador a cuál llamar? En cambio, si quiero llamar directamente a la función Run()
en mi Aibo
, tendré que también implementar esa función sin una interfaz explícita.
La implementación explícita también es útil cuando su clase necesita implementar una interfaz interna que no desea exportar públicamente desde su ensamblado. – Dave