gpt4 book ai didi

c# - .Net 泛型——从接口(interface)实现继承

转载 作者:行者123 更新时间:2023-11-30 15:35:17 27 4
gpt4 key购买 nike

我有两个对象序列“A”和“B”。比较序列应该产生第三个元素序列“C”,指示是否:

  • 对象已从“A”或“删除”
  • 从“B”“插入”。

所有剩余的元素都被认为是“匹配的”。

我想做什么:

声明Inserted<T> , Deleted<T> , 和 Matched<T>T 继承所有属性的通用类基类。泛型类必须能够从它继承的对象实例化自己。

代码:

public interface IInstantiable<T>
{
void CopyFrom(T o);
}

[Serializable]
public class Inserted<T> : T
where T : IInstantiable<T>
{
public Inserted() { }
public Inserted(T t)
{
this.CopyFrom(t);
}
}

错误:

'MyNamespace.Inserted<T>' does not contain a definition for 'CopyFrom' and no 
extension method 'CopyFrom' accepting a first argument of type 'MyNamespace.Inserted<T>'
could be found (are you missing a using directive or an assembly reference?)

进一步讨论:

我自己定义IInstantiable强制存在 CopyFrom 的接口(interface)方法。我不能使用标准 ICloneable接口(interface),因为它只定义了一个将对象复制到新实例的方法,而我需要对象在构造函数中复制其成员。

如果泛型定义了它自己的 CopyFrom 实现,错误就会消失方法;然而,这并没有达到专门化 CopyFrom 的预期目标。方法来处理基类的特定需求。只有基类才能知道应该复制哪些属性。 (或者我错过了什么?)

注意:最终对象应该具有与其基类相同的公共(public)成员,因为该对象应该能够序列化。

这在 .NET 中可行吗?

答案:

我试图做的事情是不可能的,仅仅是因为泛型类不能是模板基类的扩展。 Visual Studio 提示“无法从‘T’派生,因为它是一个类型参数。” (我还没有注意到这个错误,因为我还没有在泛型类中实现 CopyFrom 方法。)

如果我要将接口(interface)更改为一个类并在该类中提供一个 stub 实现,我可以按照下面的建议从它继承;但是,这会在我的继承层次结构中引入一个新的基类。

public class IInstantiable<T>
{
public virtual void CopyFrom(T o) { }
}

[Serializable]
public class Inserted<T> : IInstantiable<T>
where T : IInstantiable<T>
{
public Inserted() { }
public Inserted(T t)
{
base.CopyFrom(t);
}
}

不幸的是,我不能以模板化形式使用这个新基类,因为我必须在我的继承层次结构的根部引入它。仅当我删除模板并使其尽可能通用时,它才有效。

public class IInstantiable
{
public virtual void CopyFrom(Object o) { }
}

但是,这仍然不能使我的 Inserted<T> generic 看起来像它从中初始化的对象,并且由于我不能从与类型参数相同的类型继承,所以它不符合我的初始目的。

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

最佳答案

这就是您要在上面的代码中间接声明的内容。

[Serializable]
public class Inserted<T> : IInstantiable<T>
where T : IInstantiable<T>
{
public Inserted() { }
public Inserted(T t)
{
this.CopyFrom(t);
}
}

这有意义吗?

.NET 不允许您从通用参数继承。怎么可能呢?泛型在运行时进行评估,但它需要在编译时知道您的类是什么类型。

关于c# - .Net 泛型——从接口(interface)实现继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146341/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com