1

System.ICloneable インターフェイスを継承する汎用インターフェイスを作成しようとしていますが、Clone() メソッドの returntype は T です。もちろん、T 型には System.Object クラスの継承であることを確認するための制約が必要ですが、次のコードは機能しません。

public interface ICloneable<T> : System.ICloneable where T : object {

   T Clone ();

}

私は何を間違っていますか?

また、次の制約は機能しません。

  1. ここで T : System.Object
  2. T : クラス

この場合、この問題を解決するために、戻り値の型を絞り込むことができるという Liskov-principle をどのように使用できますか?

PS: 私の英語が間違っていたら申し訳ありません。私は英語のネイティブ スピーカーではありません。

4

1 に答える 1

5

なぜ制約が必要なのですか?すべてが継承されobjectます...

制約がなければコードは機能するはずですが、両方のメソッドを/Cloneと同じように実装する必要があります- .NET には共変の戻り値の型がありません。次に、メソッドが次のものを隠していることも指定する必要があります。IEnumerableIEnumerable<T>CloneICloneable

public interface ICloneable<T> : ICloneable
{
    new T Clone();
}

現在のインターフェースはやや非推奨であることに注意してくださいICloneable。クローン作成の深さを示すものがないため、ほとんどの場合、あまり役に立ちません。

非ジェネリック型を拡張する必要は本当にありますか? ユーザーは、一般的なインターフェースだけでなく、非一般的なインターフェースも使用したいと思うでしょうか?

于 2009-07-15T12:11:44.430 に答える