我在这个上画了一个空白,似乎找不到我写的任何先前的例子。我正在尝试用类实现通用接口。当我实现接口时,我觉得有些东西不能正常工作,因为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;
}
那我的班级应该是什么样的?
答案 0 :(得分:90)
你应该重做你的界面,如下:
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
}
}
答案 1 :(得分:11)
我想你可能想要重新定义你的界面:
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... }
}
答案 2 :(得分:1)
- 编辑
其他答案更好,但请注意,如果您对它的外观感到困惑,可以让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为我生成实现:)