2009-07-15 11 views
1

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

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

    T Clone(); 

} 

私は間違っていますか?

また、以下の制約が動作しません:

  1. T:クラス

どのように私はこのケースではリスコフ原理を使用することができます:TはSystem.Objectの

  • この問題を解決するためにあなたの戻り値の型を狭めることができると言いますか?

    P.S .:私が間違いを犯した場合、私の英語には申し訳ありません。私は英語のネイティブスピーカーではありません。

  • +1

    英語を言い訳する必要はありません。 –

    +0

    ちなみに、私はT型を共変変数としてマークし(その前に単語を "出"してください)、読み取り専用のプロパティ "T self"を追加するか、またはインターフェイスISelf を読み取り専用で定義することをお勧めしますプロパティ "T self"。 TはICloneable でもISelf でもないことに注意してください。これを行うと、公開クローンメソッドを持たないクラスFooとDerivedFoo、およびそれらから派生するクラスCloneableFooとCloneableDerivedFooを持つことができます。そのようなクローン化可能な派生クラスに共通の基底クラスを持たない場合でもFooのすべての派生派生をICloneable として受け入れることができます。 – supercat

    答えて

    5

    なぜ制約が必要なのですか?すべてはあなたのコードが動作するはずの制約がなければobject ...

    から継承されていますがIEnumerable/IEnumerable<T>仕事と同じように、両方のCloneメソッドを実装する必要があります - .NETは、共変戻り値の型を持っていません。 - それは、クローニングの深さの兆候を与えないので、それがほとんどでひどく有用ではないのです

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

    注現在ICloneableインタフェースがやや非推奨されていること:あなたはまた、あなたのClone方法はICloneableで1を隠していることを指定する必要がありますケース。

    本当に非ジェネリック型を拡張する必要はありますか?あなたは、非ジェネリックインターフェースと一般的なインターフェースを使いたいと思っていますか?

    +0

    私はClone()メソッドを書く必要があるので、インターフェイスが1回だけ必要です。したがって、System.ICloneable.Clone()に対して書き直すことはありません。そして私はICloneable - インターフェイスを実装する必要があります。そのメソッドによって隠されているメソッドを記述することなく。 –

    +1

    その場合、私は非ジェネリックインターフェースへの参照をすべて削除し、制約がなければ正常ではありません。 –