Подтвердить что ты не робот

Внедрение интерфейса с помощью общих методов

Я рисую пробел на этом и не могу найти какой-либо предыдущий пример, который я написал. Я пытаюсь реализовать общий интерфейс с классом. Когда я реализую интерфейс, я думаю, что что-то не работает правильно, потому что 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;
}

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

4b9b3361

Ответ 1

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

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
    }
}

Ответ 2

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

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... }
}

Ответ 3

- Изменить

Другие ответы лучше, но обратите внимание, что 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 создала для меня реализацию:)