0
public interface IMyInterface : ICloneable
{
    IMyInterface Clone();
}

'TestApp.IMyInterface.Clone()' 隐藏继承的成员 'System.ICloneable.Clone()'。如果打算隐藏,请使用 new 关键字。

我需要我的界面与ICloneable. 我该如何解决这种歧义?

更新

考虑这个具体的类,实现IMyInterface. 这个想法是它应该有一个工作Clone方法实现ICloneable,以便任何接受 an 的方法ICloneable仍然可以工作!

public class MyClass : IMyInterface
{
    #region ICloneable interface
    object ICloneable.Clone()
    {
        return this.Clone();
    }
    #endregion

    public IMyInterface Clone()
    {
        return new MyClass();
    }
}

现在,它编译了,但是有这个警告。如何摆脱警告保持与ICloneable界面的兼容性?

4

3 回答 3

3

您收到该警告是因为ICloneable指定了一个Clone返回object;的方法 不是IMyInterface. 您的Clone方法具有不同的签名,因此隐藏了ICloneable接口指定的签名。你可以把它关掉:

public interface IMyInterface : ICloneable
{
}

如果两者都需要,请使用new关键字:

public interface IMyInterface : ICloneable
{
    new IMyInterface Clone();
}

使您的实现看起来像这样:

public class MyInterface : IMyInterface
{
    object ICloneable.Clone() // explicit interface implementation
    {
        return this.Clone(); // calls the other Clone method
    }

    public IMyInterface Clone()
    {
        return new MyInterface
        {
            // member initializations
        };
    }
}

这将满足两个接口,并且不会在每个Clone实现中重复代码。

用法:

IMyInterface i = new MyInterface();
MyInterface c = new MyInterface();

object x = i.Clone(); // Calling Clone on i calls the ICloneable.Clone implementation
IMyInterface y = c.Clone(); // Calling Clone on c calls the IMyInterface.Clone implementation
于 2013-11-01T12:48:58.460 回答
1

这个编译器警告告诉你你的代码很混乱;阅读它的人可能不确定您是要覆盖基本成员还是创建新成员。

您应该添加new关键字以阐明您正在创建一个新成员。

请注意,实现您的接口的类将需要实现这两种 Clone()方法;至少其中一项需要明确实施。

于 2013-11-01T12:51:12.747 回答
1

您的方法与 Clone() 的 IClonable 接口规范同名。您应该考虑让您的 IMyInterface 更明确地指定您的克隆的功能。示例:DeepCopy() / ShallowCopy()。或者您可以使用以下方法简单地替换基本 Clone():

   public void new Clone()
于 2013-11-01T12:53:34.900 回答