Непонимание API с использованием интерфейсов - PullRequest
3 голосов
/ 01 февраля 2012

Мне только что передали API, который, кажется, является шагом вперед по сравнению с тем, к чему я привык, поскольку все, кажется, реализовано с использованием интерфейсов, и я изо всех сил пытаюсь разобраться с ними.

public partial class Form1 : Form, IFoo
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Guid jobID = AddBarToFoo(fooID, barPath);
    }

    public Guid IFoo.AddBarToFoo(string fooID, string barPath)
    {
        throw new NotImplementedException();
    }

Итак, это базовая структура.Visual Studio любезно реализовал интерфейс полностью, и я могу вызвать метод AddBarToFoo.Отлично.

Но что теперь?Очевидно, что метод является пустотой, которая требует некоторого кода, но какой код?Должен ли я обыскивать API для объектов, чтобы создать экземпляр этого метода?Или я иду по неверному пути?

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

То же самое и с интерфейсами. Они только определяют, как их будут называть. Они говорят абсолютно ничего о том, что метод должен действительно делать или как он должен это делать. Решать должен человек, реализующий интерфейс.

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.

Смысл в моем примере выше состоит в том, что код вызова не сломается. интерфейс удовлетворен - изменилось только поведение.

1 голос
/ 01 февраля 2012

Interface - это контракт, который вы собираетесь подписать в тот момент, когда вы реализуете его.То, что вы должны сделать в этом методе, зависит от того, что вы собираетесь делать с этим интерфейсом.

public class MyFooImplementation:IFoo {
    public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
        // do somethign and return GUID
    }
}

Visual Studio любезно генерирует для вас метод с обязательной подписью ,но толкает внутрь, естественно, NotImplementedException(), потому что вам все еще нужно это реализовать.И если вы забудете, отклоните или что-то еще, но ничего не напишите внутри него, ваш потребитель класса в момент использования этого метода получит это исключение.

Абсолютно правильное поведение.

...