3

抽象ジェネリック クラス「BaseClass」とクラス「SubClass」が次のように定義されています。

public class SubClass : BaseClass<SubClass>

次のようなシグネチャを持つ基本クラスで静的メソッドを定義したいと思います。

public static T GetSub() 

そして、サブクラスでこれを呼び出して、サブクラスのインスタンスを返すようにします

SubClass sub = SubClass.GetSub();

GetSub は、SubClass の既定のコンストラクターを呼び出してから、インスタンスを返す必要があります。

これは少しおかしくなり始めていますが、少なくともこれが可能かどうか知りたいです。C# のより複雑な OOP 機能に関しては、私は非常に初心者なので、ここでは暗闇の中でショットを撮っているだけです。

4

2 に答える 2

3

これを機能させることは可能ですが、あなたの側で少し作業が必要になります。この作業を行う最も簡単な方法は、次の宣言に制約を与えることTですnewBaseClass

abstract class BaseClass<T> where T : new() {
  public static T GetSub() {
    return new T();
  }
}

別の方法は使用することですActivator.CreateInstance

abstract class BaseClass<T> {
  public static T GetSub() { 
    return Activator.CreateInstance<T>();
  }
}

Functionally though this is little different than the original approach. The CreateInstance<T> method will just look for a parameterless constructor and invoke it. In fact the new T() call will typically compile down to an Activator.CreateInstance<T> call.

于 2013-03-08T05:43:07.863 に答える
1

これはうまくいきません。基本クラスで仮想メソッドを作成し、すべてのサブクラスでオーバーライドして、そのサブクラスのインスタンスを返すようにする必要があります。
または、リフレクションを使用して GetType() を呼び出し、Activator を使用して適切な型のインスタンスを作成することもできます。このように、基本クラスに必要なメソッドは 1 つだけですが、これは速度の点で効率が悪くなります。

于 2013-03-08T05:39:43.230 に答える