C # интерфейс для нескольких классов - PullRequest
2 голосов
/ 25 февраля 2010

У меня есть проект провайдера данных для доступа к базе данных.это составлено из различных классов (PersonDataProvider, JobDataProvider ...) Я хочу создать интерфейс.Нужно ли создавать интерфейс для каждого класса?Я был соблазн создать один интерфейс, а затем наследовать на всех классах.Это подразумевает частичную реализацию всех классов проектов и изменение названия классов ....... Но я думаю, что это не лучшее решение.Любое предложение?

Ответы [ 4 ]

5 голосов
/ 25 февраля 2010

Вы не наследуете интерфейс, который вы реализуете. Нет необходимости делать класс частичным, чтобы добавить к нему интерфейс.

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

Например:

public interface IDataProvider
{
    void LoadData();
}

Тогда поставщики данных будут выглядеть следующим образом:

public class MyDataProvder1 : IDataProvider
{
    // Some methods

    // Must implement LoadData
    public void LoadData()
    {
        // Do something
    }
}

public class MyDataProvder2 : IDataProvider
{
    // Some methods

    // Must implement LoadData
    public void LoadData()
    {
        // Do something
    }
}

Затем вы можете передать объекты как IDataProvider следующим образом:

IDataProvider DataProviderA = new MyDataProvider1();
IDataProvider DataProviderB = new MyDataProvider2();

// Call function that expects an IDataProvider

DoSomething(DataProviderA);
DoSomething(DataProviderB);

...

public void DoSomething(IDataProvider DataProvider)
{
    DataProvider.LoadData();
}

Надеюсь, это прояснит для вас.

4 голосов
/ 25 февраля 2010

Я думаю, что вы подходите к этому неправильно.

Когда вы создаете интерфейс, вы заключаете контракт для этих классов. Думайте об этом как "мой класс будет действовать как IMyInterface".

Если у всех ваших классов есть общий сценарий использования, тогда может подойти один общий интерфейс (IDataProvider, учитывая имена классов ..?).

0 голосов
/ 25 февраля 2010

Во-первых, я предполагаю, что есть стандартные вызовы методов для всех ваших xDataProvider классов. Например, вместо метода SelectPerson у вас есть метод Select в классе PersonDataProvider. Если нет, у вас есть работа, чтобы сделать это правильным упражнением.

В Visual Studio есть опция рефакторинга Extract Interface . Щелкните правой кнопкой мыши класс xDataProvider и выберите Refactor - Extract Interface . Теперь назовите его (например, IDataProvider) и выберите методы / свойства, которые вы хотите в своем интерфейсе, нажмите OK и все готово с этим классом.

Затем просто реализуйте этот интерфейс IDataProvider в других ваших классах xDataProvider. Предполагая, что вы уже реализовали аналогичные методы во всех ваших классах DataProvider, вам больше не придется писать код (кроме : IDataProvider).

0 голосов
/ 25 февраля 2010

Использование интерфейса зависит от того, как вы хотите организовать классы. Интерфейс позволяет подключать и работать. Итак, если вам нужен единый интерфейс, это будет означать, что у вас должен быть единый набор интерфейсов для всех классов, реализующих интерфейс. В таком случае ваши классы PersonDataProvider, JobDataProvider и т. Д. Будут иметь одинаковый набор методов. Если вы чувствуете, что они должны отличаться и быть доступными через фасад одного поставщика, вы можете подумать об использовании шаблона фасада.

Фасад будет иметь интерфейсы для отдельных провайдеров, и классы провайдеров будут реализовывать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...