Puedo decir que me relaciono con eso. Cuando comencé a aprender sobre OO y C #, tampoco obtuve interfaces. Está bien. Solo necesitamos encontrar algo que lo haga apreciar las conveniencias de las interfaces.
Déjame probar dos enfoques. Y perdóname por las generalizaciones.
Prueba 1
Digamos que eres un hablante nativo de inglés. Vas a otro país donde el inglés no es el idioma nativo. Necesitas ayuda. Necesitas a alguien que pueda ayudarte.
¿Pregunta: "Hey, naciste en los Estados Unidos?" Esto es herencia.
¿O preguntas: "Oye, hablas inglés"? Esta es la interfaz.
Si le importa lo que hace, puede confiar en las interfaces. Si te importa lo que es, confías en la herencia.
Está bien confiar en la herencia. Si necesita a alguien que hable inglés, le guste el té y le guste el fútbol, es mejor que solicite un británico. :)
Prueba 2
Ok, intentemos con otro ejemplo.
Utiliza diferentes bases de datos y necesita implementar clases abstractas para trabajar con ellas. Pasará su clase a alguna clase del proveedor de DB.
public abstract class SuperDatabaseHelper
{
void Connect (string User, string Password)
}
public abstract class HiperDatabaseHelper
{
void Connect (string Password, string User)
}
¿Herencia múltiple, dices? Intenta eso con el caso anterior. No puedes El compilador no sabrá a qué método de Connect está intentando llamar.
interface ISuperDatabaseHelper
{
void Connect (string User, string Password)
}
interface IHiperDatabaseHelper
{
void Connect (string Password, string User)
}
Ahora, hay algo con lo que podemos trabajar, al menos en C #, donde podemos implementar interfaces explícitamente.
public class MyDatabaseHelper : ISuperDatabaseHelper, IHiperDatabaseHelper
{
IHiperDataBaseHelper.Connect(string Password, string User)
{
//
}
ISuperDataBaseHelper.Connect(string User, string Password)
{
//
}
}
Conclusión
Los ejemplos no son los mejores, pero creo que se entiende.
Solo "obtendrá" interfaces cuando sienta la necesidad de ellas. Hasta que pienses que no son para ti.