Реализовать интерфейс с помощью общих методов - PullRequest
51 голосов
/ 28 августа 2009

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

Вот заглушка того, с чем я работаю:

public interface IOurTemplate<T, U>
{
    IEnumerable<T> List<T>() where T : class;
    T Get<T, U>(U id)
        where T : class
        where U : class;
}

Так как должен выглядеть мой класс?

Ответы [ 3 ]

90 голосов
/ 28 августа 2009

Вы должны переработать свой интерфейс, например так:

public interface IOurTemplate<T, U>
        where T : class
        where U : class
{
    IEnumerable<T> List();
    T Get(U id);
}

Затем вы можете реализовать его как универсальный класс:

public class OurClass<T,U> : IOurTemplate<T,U>
        where T : class
        where U : class
{
    IEnumerable<T> List()
    {
        yield return default(T); // put implementation here
    }

    T Get(U id)
    {

        return default(T); // put implementation here
    }
}

Или, вы можете реализовать это конкретно:

public class OurClass : IOurTemplate<string,MyClass>
{
    IEnumerable<string> List()
    {
        yield return "Some String"; // put implementation here
    }

    string Get(MyClass id)
    {

        return id.Name; // put implementation here
    }
}
11 голосов
/ 28 августа 2009

Я думаю, что вы, вероятно, хотите переопределить свой интерфейс следующим образом:

public interface IOurTemplate<T, U>
    where T : class
    where U : class
{
    IEnumerable<T> List();
    T Get(U id);
}

Я думаю, вы хотите, чтобы методы использовали (повторно использовали) универсальные параметры универсального интерфейса, в котором они объявлены; и что вы, вероятно, не хотите делать их универсальными методами с их собственными (отличными от интерфейса) общими параметрами.

Учитывая интерфейс, как я его переопределил, вы можете определить класс следующим образом:

class Foo : IOurTemplate<Bar, Baz>
{
    public IEnumerable<Bar> List() { ... etc... }
    public Bar Get(Baz id) { ... etc... }
}

Или определите общий класс следующим образом:

class Foo<T, U> : IOurTemplate<T, U>
    where T : class
    where U : class
{
    public IEnumerable<T> List() { ... etc... }
    public T Get(U id) { ... etc... }
}
1 голос
/ 28 августа 2009

- Редактировать

Другие ответы лучше, но учтите, что VS может реализовать интерфейс для вас, если вы не уверены, как он должен выглядеть.

Процесс описан ниже.

Ну, Visual Studio говорит мне, что это должно выглядеть так:

class X : IOurTemplate<string, string>
{
    #region IOurTemplate<string,string> Members

    IEnumerable<T> IOurTemplate<string, string>.List<T>()
    {
        throw new NotImplementedException();
    }

    T IOurTemplate<string, string>.Get<T, U>(U id)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Обратите внимание, что все, что я делал, это писал интерфейс, затем нажимал на него и ждал, пока всплывет маленький значок, чтобы VS генерировал реализацию для меня:

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