Назначение интерфейсов - позволить вам использовать два разных класса , как если бы они были одного типа . Это неоценимо, когда речь идет о разделении интересов.
например. Я могу написать метод, который читает данные из IDataReader. Моему методу не нужно знать (или заботиться), является ли это SqlDataReader и OdbcDataReader или OracleDataReader.
private void ReadData(IDataReader reader)
{
....
}
Теперь, допустим, мне нужен этот метод для обработки данных, поступающих из нестандартного файла данных. Я могу написать свой собственный объект, который реализует IDataReader, который знает, как читать этот файл, и мой метод снова не знает и не заботится о том, как реализован этот IDataReader, только то, что ему передан объект, который реализует IDataReader.
Надеюсь, это поможет.