用泛型方法实现接口

我对这个问题一无所知,似乎找不到我以前写过的任何例子。我试图用一个类实现一个泛型接口。当我实现接口时,我认为有些地方不正常工作,因为 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;
}

那么我的课应该是什么样子的呢?

111982 次浏览

I think you probably want to redefine your interface like this:

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

I think you want the methods to use (re-use) the generic parameters of the generic interface in which they're declared; and that you probably don't want to make them generic methods with their own (distinct from the interface's) generic parameters.

Given the interface as I redefined it, you can define a class like this:

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

Or define a generic class like this:

class Foo<T, U> : IOurTemplate<T, U>
where T : class
where U : class
{
public IEnumerable<T> List() { ... etc... }
public T Get(U id) { ... etc... }
}

-- Edit

The other answers are better, but note you can have VS implement the interface for you, if you are confused as to how it should look.

Process described below.

Well, Visual Studio tells me it should look like this:

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
}

Note that all I did was write interface, then click on it, and wait for the little icon to popup to have VS generate the implementation for me :)

You should rework your interface, like so:

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

Then, you can implement it as a generic class:

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

Or, you can implement it concretely:

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