по вызову работавший для меня. мой код похож:
const stubFnc = sinon.stub(myObject, "myFunction");
stubFnc.onCall(0).returns(mockObject1);
stubFnc.onCall(1).returns(mockObject2);
Вы сможете передать свой объект методу (или удовлетворить ограничение типа), который ожидает интерфейс в качестве аргумента. C # не поддерживает « утиный ввод ». Просто написав методы, определенные интерфейсом, объект не будет автоматически "совместим" с типом интерфейса:
public void PrintCollection<T>(IEnumerable<T> collection) {
foreach (var x in collection)
Console.WriteLine(x);
}
Если List
не реализовал IEnumerable
, вы не сможете передать его в качестве аргумента методу PrintCollection
(даже если бы у него был метод GetEnumerator
).
По сути, интерфейс объявляет договор. Реализация интерфейса заставляет ваш класс быть привязанным к контракту (путем предоставления соответствующих членов). Как следствие,
Это поможет, если вы попытаетесь:
Доброта,
Дэн
Интерфейс определяет контракт (то, что объект может делать), а конкретный класс (или структура) определяет конкретное поведение.
Например, IList - это интерфейс, он определяет методы, которые конкретный объект должен предоставить, чтобы его можно было использовать, как любой другой объект, реализующий IList. Везде, где можно использовать IList, также можно использовать ваш объект, реализующий IList. То, как вы его конкретно реализуете, и поведение вашего объекта при вызове этих методов IList остается на ваше усмотрение.
Вы не привязаны к наследованию классов - вы можете применить интерфейс к любому классу. Любой класс может иметь несколько интерфейсов - C # не поддерживает множественное наследование классов, т.е. вы обеспечиваете хороший уровень абстракции через интерфейс
Основное преимущество заключается в удобочитаемости кода, удобстве сопровождения кода и «семантике» кода.
Интерфейс является ссылочным типом и содержит только абстрактные элементы. Членами интерфейса могут быть события, методы, свойства и индексаторы. Но интерфейс содержит только объявление для своих членов. Любая реализация должна быть помещена в класс, который их реализует. Интерфейс не может содержать константы, поля данных, конструкторы, деструкторы и статические члены. Все объявления членов внутри интерфейса неявно общедоступны.