上下文:.NET 4.0,C#C#使用泛型和接口实现
我创建了一组接口和一组实现它们来提供某些服务的接口。客户端使用具体类,但调用使用接口声明的方法作为参数类型。
一个简单的例子是这样的一个:
namespace TestGenerics
{
// Interface, of fields
interface IField
{
}
// Interface: Forms (contains fields)
interface IForm<T> where T : IField
{
}
// CONCRETE CLASES
class Field : IField
{
}
class Form <T> : IForm<T> where T : IField
{
}
// TEST PROGRAM
class Program
{
// THIS IS THE SIGNATURE OF THE METHOD I WANT TO CALL
// parameters are causing the error.
public static void TestMethod(IForm<IField> form)
{
int i = 1;
i = i * 5;
}
static void Main(string[] args)
{
Form<Field> b = new Form<Field>();
Program.TestMethod(b);
}
}
}
的代码对我来说很有意义,但我得到的编译器错误:
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
我不知道我做错了什么,我在网上看了很多页面,但没有解决我的问题。
是否有不会改变什么,我试图建立,大部分的架构的解决方案:
编辑:我设计的接口的方式,使得他们应该独立于实现它们的具体clases的。具体的clases可以从DLL加载,但大多数应用程序与接口一起工作。在某些情况下,我需要使用具体的clases,特别是在使用需要序列化的clases时。
在此先感谢。
亚历
这会在协方差的境界之下。具体来说,如果将['out' generic modifier](http://msdn.microsoft.com/zh-cn/library/dd469487.aspx)添加到您的签名'interface IForm where T:IField',那么它将工作。但是这增加了其他限制/考虑因素,所以我不能评论它是否适用于您当前的设计/使用。 –
我很好奇你在用这个设计来完成什么。 – sidesinger
非常感谢这两个肛门,他们真的很好。我添加了一个编辑,解释为什么我以这种方式设计了解决方案,但是这两种方法都可以解决我的问题。问候。 – Sugar