В основном, Интерфейсы позволяют Программе изменять Реализацию без необходимости сообщать всем клиентам, что им теперь нужен объект "Bar" вместо объекта "Foo".Он сообщает пользователям этого класса, что он делает, а не то, чем он является.
Пример:
Метод, который вы написали, хочет перебрать заданные ему значения.Теперь есть несколько вещей, которые вы можете перебирать, например, списки, массивы и коллекции.
Без интерфейсов вам придется написать:
public class Foo<T>
{
public void DoSomething(T items[])
{
}
public void DoSomething(List<T> items)
{
}
public void DoSomething(SomeCollectionType<T> items)
{
}
}
И для каждого нового итеративного типа, который у вас будетчтобы добавить другой метод, или пользователь вашего класса должен будет привести свои данные.Например, с этим решением, если у него есть Collection of FooCollectionType, он должен преобразовать его в Array, List или SomeOtherCollectionType.
С интерфейсами вам нужно только:
public class Foo<T>
{
public void DoSomething(IEnumerable<T> items)
{
}
}
Это означает, что ваш класснужно только знать, что все, что пользователь передает ему, может быть повторено.Если пользователь изменяет свой SomeCollectionType на AnotherCollectionType, он не должен ни приводить, ни изменять ваш класс.
Обратите внимание, что абстрактные базовые классы допускают такой же тип абстракции, но имеют некоторые небольшие различия в использовании.