c# - 为什么我的克隆代码不能编译?

标签 c# interface clone

我想使用这个简单的克隆界面。看起来它应该编译,但它没有。我收到一条消息说我的 BObject 类没有实现 DeepClone()。我不明白这一点,因为我有一个 DeepClone() 方法和我的 BObjectimplements IObject

interface IDeepCloneable<T>
{
    T DeepClone();
}

interface IObject : IDeepCloneable<IObject>
{
    string Name { get; }
    double Sales { get; }
}

//'BObject' does not implement interface member
//  'IDeepCloneable<IObject>.DeepClone()'
class BObject : IObject
{
    public string Name { get; set; }
    public double Sales { get; set; }

    public BObject DeepClone()
    {
        return new BObject() { Name = this.Name, Sales = this.Sales };
    }
}

我是否声明了我的接口(interface)错误?


或者 DeepClone 实现?我可以使用这段代码:

public IObject DeepClone() //returns an IObject instead of a BObject
{
    return new BObject() { Name = this.Name, Sales = this.Sales };
}

我遇到的问题是没有检查 BObject.DeepClone() 方法是否返回 BObject 作为结果。我可以有一个看起来像这样的类:

class BObjectImposter : IObject
{
    public string Name { get; set; }
    public double Sales { get; set; }

    public IObject DeepClone()
    {
        //returns a BObject instead of a BObjectImposter
        return new BObject() { Name = this.Name, Sales = this.Sales };
    }
}

使用这个类,我可以这样写:

BObjectImposter objImp = new BObjectImposter();
IObject copy = objImp.DeepClone();

我可能认为 copyBObjectImposter 的一个实现,但它实际上是一个不相关的类 BObject 的实现,它恰好也实现了IObject。我知道接口(interface)的意义在于我使用哪个实现无关紧要,但这对我来说似乎不是好的代码。也许在我的 BObjectImposter 实现中的某个地方,我希望 DeepClone() 返回一个 BObjectImposter 对象。此外,IObject 的一个实现不应依赖于 IObject 的另一个实现。


也许我可以使IObject 成为一个抽象类并在那里声明DeepClone()。如果我有一个实现(称为 ObjectA),我需要在设置 Sales 之前设置 Name,这似乎可能会破坏我的设计构造函数,以及另一个实现(称为 ObjectB),我需要在构造函数中设置 Name 之前设置 Sales

最佳答案

正如您在问题中暗示的那样,IObject实现了 IDeepClonable<IObject>,因此它的 DeepClone()方法必须返回 IObject .

您需要使用 CRTP一路走来:

interface IObject<T> : IDeepCloneable<T> where T : IObject<T>
class BObject : IObject<BObject>

(您还应该将 where T : IDeepCloneable<T> 添加到 IDeepCloneable )

关于c# - 为什么我的克隆代码不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17089951/

相关文章:

c# - 无法在运行时显示自定义字体 - Windows Phone 8.1 MVVM - FontAwesome

c# - WebAPI,将一个或集合对象发布到同一操作而不更改消息正文

c# - 如何在 C# 中克隆图形?

java - 如何避免实现所有方法

c# - 你能帮我在一个实际的例子中理解抽象类和接口(interface)的用法吗?

java - 什么取代了方法克隆(可序列化)

javascript - jQuery clone() 多个列表并将每个列表附加到其原始列表

c# - NHibernate 标准按一天中的时间搜索

c# - C#中的类和基类继承

java - 如何告诉 Java 使用哪个接口(interface)发送多播数据