То же самое и с интерфейсами. Они только определяют, как их будут называть. Они говорят абсолютно ничего о том, что метод должен действительно делать или как он должен это делать. Решать должен человек, реализующий интерфейс.
VS "реализует" метод, добавляя одну строку throw new NotImplementedException();
, которая на самом деле просто удовлетворяет компилятору.
Вот две возможные (надуманные) реализации, которые делают совершенно разные вещи. Оба реализуют IFoo
:
public class DbFoo:IFoo {
public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
// this might add a Foo to the database and return its Guid
}
}
public class ListBasedFoo:IFoo {
public ListBasedFoo() { MyList = new List<Foo>(); }
public List<Foo> MyList { get; private set; }
public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
// this could add a Foo to MyList, and return some Guid to reference it
}
}
Редактировать ... Вы увидите, что интерфейсы часто используются в местах, где абстрактное поведение важно, но реализация может отличаться. Например, интерфейс для сохранения объектов. Во время разработки вы можете использовать макет, который помещает и помещает элементы в список в памяти. Позже вы можете использовать интерфейс, который напрямую обращается к базе данных через ADO .NET или Entity Framework или LINQ to SQL. Возможно, в другой момент времени жизни приложения будет добавлена новая реализация, использующая вместо этого веб-службы WCF.
Смысл в моем примере выше состоит в том, что код вызова не сломается. интерфейс удовлетворен - изменилось только поведение.