que explicar el concepto a los laicos usando una analogía que la mayoría de la gente a entender - moldeo de plástico.
La interfaz define la forma de un objeto de la misma manera exacta un molde proporcionará la forma del producto acabado.
Se puede inyectar un molde con plástico blanco, de plástico azul, algo exótico como un epoxi o arcilla.
Lo que importa es, no importa lo que realmente están hechas de, todos ellos tienen la misma forma consistente exacta para el comprador del producto.
Para el código, esto significa que no importa qué código se utiliza para implementar la interfaz, todos siguen el mismo contrato/forma coherente para el usuario final.
Espero que pueda ayudar un poco.
Editar -
Para extender la analogía con clases abstractas, imaginemos el siguiente paso en el proceso de moldeo. Ejecutas una producción de plástico blanco, azul y rojo, pero luego cada artículo debe ser pintado en una fábrica separada, solo los enviamos.
El elemento no está terminado, pero tiene su forma definida. Alguien más tarde vendrá y completará los detalles que nuestra fábrica dejó en blanco.
Estos artículos no se pueden vender hasta que obtengan el último paso de pintado.
En el código, la implementación abstracta de la interfaz proporciona algunos (o ninguno) de la implementación, pero deja otra clase descendiente para completar el contrato, y de la misma manera nadie puede crear una instancia de la clase hasta el contrato se ha completado.
Del mismo modo, igual puede referirse a una clase abstracta en el código, al igual que puede referirse al artículo de molde sin pintar como una "cosa de moldeado blanco" o no pintada.
Editar 2
Aquí está un ejemplo corto
void Main()
{
//IMold mold = new IMold(); // error - can't create instance of an interface
//Fruit fruit = new Fruit(); // error - can't create instance of an abstract class
Apple apple1 = new Apple(); // good
Orange orange1 = new Orange(); // good
Fruit apple2 = (Fruit)apple1; // good - Apples are fruit
Fruit orange2 = (Fruit)orange1; // good - oranges are fruit
IFruitMold apple3 = (IFruitMold)apple2; // good - Apples fit the Mold
IFruitMold orange3 = (IFruitMold)orange2; // good - Oranges also fit the mold
//now I can do this:
//Notice that `fruits` is of type IList<T> but the new is List<T>
//This is the exact concept we are talking about
//IList<T> is some kind of set of items that can be added or subtracted from
//but we don't have to care about the implementation details of *HOW* this is done
IList<IFruitMold> fruits = new List<IFruitMold>();
fruits.add(apple3);
fruits.add(orange3);
foreach(var fruit in fruits)
{
fruit.PlasticColor.Dump(); // ok I can read
fruit.PlasticColor = ""; // error - no Set defined in the interface
// depending on the **implementation details** of what type of fruit this is true or false
// we don't care in the slightest, we just care that we have some IFruitMold instances
fruit.RequiresPainting.Dump();
}
}
interface IFruitMold
{
string PlasticColor { get; }
bool RequiresPainting { get; }
}
abstract class Fruit : IFruitMold
{
private string m_PlasticColor = string.Empty;
public string PlasticColor { get; private set; }
public abstract bool RequiresPainting { get; }
}
//notice that we only define the abstract portion of the base class
//it defined PlasticColor for us already!
//the keyword `override` is required - it is to make it clear that
//this member is overriding a member from it's parent.
class Apple : Fruit
{
public override bool RequiresPainting { get { return true; } }
}
class Orange : Fruit
{
public override bool RequiresPainting { get { return false; } }
}
Probablemente el aspecto más importante de las interfaces es que el programador puede codificar en términos de interfaces. Por ejemplo, un programador puede codificar su sitio web de preguntas y respuestas, StackUnderflow, para analizar el contenido enviado por el usuario con una interfaz 'Parser' sin tener que preocuparse si es' MarkdownParser', 'LatexParser',' AsciidocParser', etc. Si cambia de opinión sobre en qué formato debe estar el contenido, puede cambiar una sola línea de código. Mientras la clase que elija implemente la interfaz 'Parser', todo funcionará bien. –
Aparte ("los hace sentir grandes"): siempre que no explico algo porque la explicación es demasiado compleja, me siento más pequeño, no más grande. – phoog