Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net泛型--接口的实现继承_C#_Generics_Inheritance_Interface - Fatal编程技术网

C# .Net泛型--接口的实现继承

C# .Net泛型--接口的实现继承,c#,generics,inheritance,interface,C#,Generics,Inheritance,Interface,我有两个对象序列'A'和'B'。比较序列应产生第三个元素序列“C”,表明: 对象已从“A”中“删除”或 “B”中的“inserted” 所有剩余元素均视为“匹配” 我想做的是: 声明插入的,删除的,以及匹配的泛型类,这些泛型类从T基类继承其所有属性。泛型类必须能够从其继承的对象实例化自身 守则: 不幸的是,我不能以模板化的形式使用这个新基类,因为我必须在继承层次结构的根目录中引入它。只有删除模板并使其尽可能通用,它才能工作 public class IInstantiable { p

我有两个对象序列'A'和'B'。比较序列应产生第三个元素序列“C”,表明:

  • 对象已从“A”中“删除”或
  • “B”中的“inserted”
所有剩余元素均视为“匹配”

我想做的是: 声明
插入的
删除的
,以及
匹配的
泛型类,这些泛型类从
T
基类继承其所有属性。泛型类必须能够从其继承的对象实例化自身

守则: 不幸的是,我不能以模板化的形式使用这个新基类,因为我必须在继承层次结构的根目录中引入它。只有删除模板并使其尽可能通用,它才能工作

public class IInstantiable
{
    public virtual void CopyFrom(Object o) { }
}
但是,这仍然不会使我的插入的泛型看起来像它从中初始化的对象,并且由于我不能从与类型参数相同的类型继承,因此它不适合我的初始用途


从基于类型系统的“奇特的泛型”转移到更多(ahem)泛型注释结构可能是最好的解决方案;但是,我选择的序列化方法(XmlSerialization)的默认行为没有使此配置成为可行解决方案的自动支持。仿制药不起作用;改用硬编码的类定义

这是您试图在上面的代码中间接声明的内容

[Serializable]
public class Inserted<T> : IInstantiable<T>
    where T : IInstantiable<T>
{
    public Inserted() { }
    public Inserted(T t)
    {
        this.CopyFrom(t);
    }
}
[可序列化]
插入的公共类:iInstallable
其中T:不可安装
{
公共插入(){}
公共插入(T)
{
这个.CopyFrom(t);
}
}
这有意义吗


.NET不允许从泛型参数继承。怎么可能呢?泛型是在运行时计算的,但它需要知道类在编译时的类型。

如果我理解正确,您需要用对象状态的概念(插入、删除或匹配)来注释对象序列

你真的不需要花哨的泛型;有什么问题吗

enum ChangeState { Inserted, Deleted, Matched }
struct<T> Annotated { 
    public T Obj; 
    public ChangeState;
}
enum ChangeState{插入、删除、匹配}
结构注释{
公共交通工具;
公共国家;
}
您可以根据需要将其标记为序列化(带注释的
对象可以在没有相同属性/字段的情况下很好地序列化)


虽然您可以在类型系统中编码更多的信息,但我不清楚这里有什么好处。确实要这样做吗?

首先,不允许使用
Inserted:T
。看起来您只需要:
公共类Inserted:iinstatable
。这对您不起作用吗?我注意到您并没有继承自
IInstantiable
,而是基于它创建了一个模板类型。您是否尝试过
公共类Inserted:iinstantable:where T iinstantable
?(事实上,因为你没有模板,where不会编译,所以不要使用它)泛型约束不应该是必需的。从泛型参数继承是绝对不可能的。但我不认为这是一个根本问题。为什么编译器需要在编译时知道“the”类型?它在任何情况下都不适用于泛型。它甚至不知道内存布局(例如,值类型的参数;比如long和byte的元组)。C#只是碰巧不支持它。不幸的是,这个答案并不能为我试图实现的目标提供解决方案。见上面的答案部分@伊蒙,有很多东西C#刚好不支持。这是一个有趣的解决方案。它确实使事情变得有些复杂,因为我将使用XmlSerialization创建新的标记元素,这些元素将取决于标志的状态。元素内容需要与原始对象相同,尽管我可能可以解决这个问题。啊,这很有帮助:我很难达到您的基本目标:-)。您可以使用来确保序列化是“可添加的”;i、 生成与它包含的对象相同的xml,只需要一些额外的属性。是的,该属性允许我根据对象类型轻松更改元素名称。我看不到基于对象属性值进行相同操作的简单方法。到目前为止,我已经能够避免自定义实现
IXmlSerializable
——我希望保持这种方式。谢谢是的,从外观上看,
IXmlSerializable
实际上不起作用-它可以控制序列化为的元素的内容,但不能控制名称。
public class IInstantiable
{
    public virtual void CopyFrom(Object o) { }
}
[Serializable]
public class Inserted<T> : IInstantiable<T>
    where T : IInstantiable<T>
{
    public Inserted() { }
    public Inserted(T t)
    {
        this.CopyFrom(t);
    }
}
enum ChangeState { Inserted, Deleted, Matched }
struct<T> Annotated { 
    public T Obj; 
    public ChangeState;
}