C# .net泛型约束和对象继承编译问题
我有以下情况。此代码将引发Test2的编译器错误 类型“InheritedChild”不能用作泛型类型或方法“PanelGenericoGrid”中的类型参数“T”。没有从“InheritedChild”到“SerializerBase”的隐式引用转换C# .net泛型约束和对象继承编译问题,c#,.net,generics,inheritance,polymorphism,C#,.net,Generics,Inheritance,Polymorphism,我有以下情况。此代码将引发Test2的编译器错误 类型“InheritedChild”不能用作泛型类型或方法“PanelGenericoGrid”中的类型参数“T”。没有从“InheritedChild”到“SerializerBase”的隐式引用转换 公共类序列化数据库 { } 公共类DirectChild:SerializerBase { } 公共类InheritedChild:DirectChild { } 公共类PanelGenericyGrid:UserControl 其中T:
公共类序列化数据库
{
}
公共类DirectChild:SerializerBase
{
}
公共类InheritedChild:DirectChild
{
}
公共类PanelGenericyGrid:UserControl
其中T:SerializerBase,new()
{
}
...
板栅试验;
panelgenericiogridest2;
...
我确信我的建议是错误的。我希望在以下情况下,DirectChild和InheritedChild都将其适当的类型赋予SerializerBase构造函数
如何使代码按其需要的方式工作?谢谢
一些关于实际信息的信息。SerializerBase有一组静态函数,这些函数实现为根据类型自动序列化和反序列化它们自己
DirectChild有一组字符串,这些字符串将存储在磁盘上并进行恢复
InheritedChild拥有DirectChild的所有成员以及更多成员
基本上,我需要DirectChild.Serialize(文件名)和IndirectChild.Serialize(文件名),其中Serialize是SerializeBase的公共成员问题是,
InheritedChild
没有实现SerializerBase
,因此它不满足PanelGenericoGrid
中t
的约束
不幸的是,我们不清楚解决方案的目的是什么,因为我们不知道您想要实现什么
在现实生活中,
SerializerBase
的成员是什么?如果您能给我们提供更多的上下文,它将帮助我们帮助您。问题是InheritedChild
没有实现SerializerBase
,因此它不满足panelgeneriicogride
中t
的约束
不幸的是,我们不清楚解决方案的目的是什么,因为我们不知道您想要实现什么
在现实生活中,
SerializerBase
的成员是什么?如果您能给我们提供更多的上下文,这将有助于我们帮助您。在我看来,您缺少一个接口:
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() { }
您是执行二进制序列化,还是将其序列化为XML?在我看来,您缺少一个接口:
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() { }
您是执行二进制序列化,还是将其序列化为XML?我认为接口是最好的方式。这将是一些额外的代码,但由于BaseSerializer中的每个方法都是静态的,所以不会有太多额外的工作。谢谢如果每个方法都是静态的,我认为您应该真正使用mixin方法。。。。继承在这种情况下没有意义,因为接口中不能有静态方法,也不能用静态方法实现接口方法。我认为接口是最好的方法。这将是一些额外的代码,但由于BaseSerializer中的每个方法都是静态的,所以不会有太多额外的工作。谢谢如果每个方法都是静态的,我认为您应该真正使用mixin方法。。。。在这种情况下,继承没有意义,因为接口中不能有静态方法,也不能用静态方法实现接口方法。
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() { }