.net泛型约束和对象继承编译问题

时间:2010-08-09 17:53:07

标签: c# .net generics inheritance polymorphism

我有以下情况。此代码将为Test2抛出编译器错误

类型'InheritedChild'不能在泛型类型或方法'panelGenericIOGrid'中用作类型参数'T'。没有从“InheritedChild”到“SerializerBase”的隐式引用转换。

public class SerializerBase<T> 
{  
}
public class DirectChild    : SerializerBase<DirectChild> 
{ 
}
public class InheritedChild : DirectChild 
{ 
}

public  class panelGenericIOGrid<T> : UserControl
   where T: SerializerBase<T>, new()
{
}

...
panelGenericIOGrid<DirectChild> test;
panelGenericIOGrid<InheritedChild> test2;
...

我非常确信我的实施是错误的。我想要以下情况,DirectChild和InheritedChild都会将他们的appropriote类型赋予SerializerBase构造函数。

如何让代码按照需要的方式工作?谢谢!

有关实际信息的一些信息。 SerializerBase有一组静态函数,可以根据类型自动序列化和反序列化。

DirectChild有一组字符串,将存储在磁盘上并恢复。

Inhertiedchild拥有DirectChild的所有成员以及更多成员。

基本上我需要DirectChild.Serialize(filename)和IndirectChild.Serialize(filename),其中Serialize是SerializeBase的公共成员

2 个答案:

答案 0 :(得分:2)

问题是InheritedChild没有实现SerializerBase<InheritedChild>,因此它无法满足TpanelGenericIOGrid<T>的约束。

不幸的是,目前还不清楚解决方案是否因为我们不知道你想要实现的目标。

现实生活中SerializerBase<T>的成员是什么?如果你能给我们更多的背景,那将有助于我们帮助你。

答案 1 :(得分:1)

在我看来,你错过了一个界面:

public interface ISerializerBase<T> { }
public class SerializerBase<T> : ISerializerBase<T> { } 
public class DirectChild : SerializerBase<DirectChild> { }
public class InheritedChild : DirectChild, ISerializerBase<InheritedChild> { } 
public class panelGenericIOGrid<T> where T: ISerializerBase<T>, new() { } 

我不知道这会如何改变你的设计。您可能需要在InheritedChild中重新实现一些继承的方法或一些接口方法。

但是,也许你可以这样做otherwise

public interface MSerializable {}
public static class Serializable {
  public static void Serialize(this MSerializable self, string fileName) { 
    // self will refer to the right type, 
    // no need to use generics if all you want is to serialize it ...
  }
}

public class DirectChild : MSerializable { }
public class InheritedChild : DirectChild { } 
public class panelGenericIOGrid<T> where T: MSerializable, new() { } 

您是否会进行二进制序列化,还是将其序列化为XML?