-2

いくつかの汎用クラスを定義したい

class A : IClonable
{
    clone();
}

クラスTから派生した新しいクラスを定義したいのですが、Tの基本クラスはA ==>なので、新しいクラスがBの場合、クラスBでIClonableを再度定義しなくてもCloneを呼び出すことができます。

これどうやってするの ?

4

3 に答える 3

2

TがICloneableから継承するときに、MyClassでcloneメソッドを使用できるようにする方法を尋ねていると思います。MyClassはTから継承していないため、MyClassもIClonableから継承していることを明示的に示さなければ、これは不可能です。これは、Tに何らかの形で関連するメソッド/プロパティを持つクラスです(つまり、タイプTのクラスで操作を形成できるようにします。

ジェネリッククラスを介してTにアクセスできるようにするために私が思いついた最も近い方法は、デフォルトのインデクサープロパティをハックすることです。このように、MyClassインスタンスの最後に[1]を追加すると、Tクローンの単一のインスタンスが表示されます。

    class A : ICloneable
    {
        public object Clone()
        {
            throw new NotImplementedException();
        }
        public override string ToString()
        {
            return "Demo";
        }
    }
    class B<T> where T : A
    {
        T myT;

        public B(T value)
        {
            this.myT = value;
        }

        //hack the default indexer to instead allow it to be used to return N clones of myT
        public IEnumerable<T> this[int index]
        {
            get
            {
                for (int i = 0; i < index; i++)
                {
                    yield return (T)this.myT.Clone();
                }
            }
        }
    }

    class Program
    {
        public static void Main(string[] args)
        {
            B<A> myB = new B<A>(new A());
            Console.WriteLine( myB[1].ToString());
            Console.ReadKey();
        }
    }
于 2012-10-28T14:16:04.260 に答える
0

あなたの質問は明確ではありませんが、私が正しく理解していて、ジェネリッククラスを作成してTの型を強制したい場合は、これが必要です。

public class B<T> where T : A

于 2012-10-28T13:53:01.867 に答える
0

ここでトリッキーなことがあるかどうかはわかりません。非ジェネリッククラスからジェネリック制約のあるクラスを継承できます。

class A
{
    protected method1(); 
}

class B<T> : A
{
    //implement the rest
}
于 2012-10-28T13:54:07.417 に答える