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

「TestApp.IMyInterface.Clone()」は、継承されたメンバー「System.ICloneable.Clone()」を非表示にします。非表示が意図されている場合は、new キーワードを使用します。

と互換性のあるインターフェイスが必要ICloneableです。このあいまいさを解決するにはどうすればよいですか?

アップデート

を実装するこの具象クラスを考えてみましょうIMyInterface。アイデアは、 を受け入れるメソッドが引き続き機能するように、機能Cloneするメソッド実装を持たなければならないということです!ICloneableICloneable

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指定しているため、その警告が表示されます。ではありません。メソッドの署名が異なるため、インターフェイスで指定された署名が隠されています。あなたはそれをそのままにしておくことができます:CloneobjectIMyInterfaceCloneICloneable

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()メソッドを実装する必要があることに注意してください。それらの少なくとも 1 つを明示的に実装する必要があります。

于 2013-11-01T12:51:12.747 に答える
1

メソッドの名前は、Clone() の IClonable インターフェイス仕様と同じです。クローンの動作を IMyInterface でより明示的に指定することを検討する必要があります。例: DeepCopy() / ShallowCopy()。または、次を使用してベース Clone() を単純に置き換えることができます。

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