いくつかの汎用クラスを定義したい
class A : IClonable
{
clone();
}
クラスTから派生した新しいクラスを定義したいのですが、Tの基本クラスはA ==>なので、新しいクラスがBの場合、クラスBでIClonableを再度定義しなくてもCloneを呼び出すことができます。
これどうやってするの ?
いくつかの汎用クラスを定義したい
class A : IClonable
{
clone();
}
クラスTから派生した新しいクラスを定義したいのですが、Tの基本クラスはA ==>なので、新しいクラスがBの場合、クラスBでIClonableを再度定義しなくてもCloneを呼び出すことができます。
これどうやってするの ?
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();
}
}
あなたの質問は明確ではありませんが、私が正しく理解していて、ジェネリッククラスを作成してTの型を強制したい場合は、これが必要です。
public class B<T> where T : A
ここでトリッキーなことがあるかどうかはわかりません。非ジェネリッククラスからジェネリック制約のあるクラスを継承できます。
class A
{
protected method1();
}
class B<T> : A
{
//implement the rest
}