У Icognito есть хороший ответ (за который я проголосовал). Я только хотел добавить следующее:
Интерфейс определяет сигнатуры методов, которые должен иметь любой реализующий объект. Это позволяет вашему коду вызывать методы для этих объектов, ничего не зная об этом.
Класс определяет сигнатуры методов и может определять тела и свойства методов. Класс может реализовывать интерфейс. Это дает вам возможность хранить вместе данные и код манипуляции.
Отдаленный пример Икогнито был на самом деле лучше, чем велосипед. Телевизор может иметь интерфейс типа:
interface ITelevision {
void TogglePower();
void ChangeChannel( Int32 channel);
}
Пару объектов, которые могут иметь дело с этим интерфейсом, будут один или несколько телевизионных объектов и объект Remote, например:
class SonyTelevision: ITelevision {
public void TogglePower {
//Perform the operation to turn the TV on or off
}
public void ChangeChannel (Int32 channel) {
// Perform the operation of changing the channel
}
}
class ToshibaTelevision: ITelevision {
public void TogglePower {
//Perform the operation to turn the TV on or off
}
public void ChangeChannel (Int32 channel) {
// Perform the operation of changing the channel
}
}
class Remote {
private _television : Object; // here we don't care what kind of TV it is.
public void ToggleTvPower {
ITelevision tv = _television as ITelevision;
tv.TogglePower();
}
}
В приведенном выше описании производители телевизоров Sony и Toshiba могут иметь собственную иерархию классов для телевизоров. Тем не менее, они оба реализуют общий интерфейс ITelevision, который значительно облегчает кодирование для этих классов.
Обратите внимание, что интерфейс означает, что реализация оставлена на усмотрение реализующего класса. В конце концов, пока все используют ITelevision, любой пульт дистанционного управления сможет управлять любым телевизором. Даже будущие ...
Последнее замечание: абстрактные классы аналогичны интерфейсам в том, что абстрактные классы требуют, чтобы потомки предоставляли тела метода. Однако, поскольку класс может наследовать только от одного родительского класса, тогда как класс может реализовывать столько интерфейсов, сколько вы хотите.