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