0

抽象クラス:

abstract class PersistentList<T>

public static PersistentList<T> GetInstanceOfDerivedClass()
{
    //???
}

派生クラス:

public class Managers : PersistentList<Manager> 

だから、私はしたいです:

Managers managers = Managers.GetInstanceOfDerivedClass();

それは可能ですか?

選択肢は次のとおりです。

int clientID = 3;

Managers managers = Managers.For("Client", new { ClientID = clientID});

Managers managers = new Managers(new { ClientID = clientID });

Managers managers = new Managers();
managers.ClientID = clientID;
managers.Load("ForClient");
//alternatively:
Database.Load(managers, "ForClient");

//this works, however requires the above code in the constructor.
Managers managers = new Managers(clientID);

//If the static method on the abstract class (Managers.For) could determine
//the type calling, it would eliminate the need for repetitive constructors.

上記のすべてが利用可能で、良いテクニックを決定しようとしているだけです。

4

4 に答える 4

0

これは奇妙な状況のように思えますが、あなたが何らかの形でそのようなパターンに限定されていると仮定すると、これは私が思いつくことができる最も近いものです(まだあなたがやろうとしていることとは異なります):

abstract class PersistentList<T>
{
    public static T2 GetInstanceOfDerivedClass<T2>() where T2 : PersistentList<T>
    {
        return (T2)Activator.CreateInstance(typeof(T2));
    }
}

class Manager { }

class Managers : PersistentList<Manager> { }

使用法:

Managers managers = PersistentList<Manager>.GetInstanceOfDerivedClass<Managers>();
于 2012-06-24T23:33:13.227 に答える
0

あなたが説明したようなパターンを使用することもできますが、場合によっては、ファクトリ メソッドを非ジェネリックな静的クラス内のジェネリック メソッドにすることが役立つ場合があります。特に、メソッドが型推論に使用できるパラメーターを受け取る場合はそうです。たとえば、 から最初に入力される新しいコレクションを作成するメソッドがある場合、場合によっては、 のタイプに基づいて作成するコレクションのタイプを自動的に推測できるため、よりもT[]使用する方が便利な場合があります。配列パラメータ。SuperCollection<T> SuperCollection.Create<T>(T InitialValues[])SuperCollection<T> SuperCollection<T>.Create(T InitialValues[])

それ以外は、作成されるオブジェクトのタイプがコンパイル時にわからない可能性のあるさまざまな要因に依存する可能性がある場合、あなたが説明することは完全に合理的なパターンだと思います。

于 2012-06-25T18:01:51.133 に答える
0

これは、強力な型付けが必要な場合の最も簡単な方法だと思います(つまり、を要求したときManagersだけでなく、メソッドが を返します)。PersistentList<Manager>Managers

static class PersistentList
{
    public static T GetInstanceOfDerivedClass<T, U>() where T : PersistentList<U>
    {
        throw new NotImplementedException();
    }
}

Managers managers = PersistentList.GetInstanceOfDerivedClass<Managers, Manager>();

次のこともできます。

abstract class PersistentList<T, U> where T : PersistentList<T, U>
{
    public static T GetInstanceOfDerivedClass()
    {
        throw new NotImplementedException();
    }
}
public class Managers : PersistentList<Managers, Manager>
{
}

これにより、例で署名を使用できますManagers.GetInstanceOfDerivedClass()。ただし、この設計パターンは紛らわしいため、使用を思いとどまらせます。

于 2012-06-24T23:15:47.433 に答える
0

静的メソッドではできません。なぜそうしたいのかわかりませんが、これを行うことができます

    public abstract class PersistentList<T>
    {
        public PersistentList<T> GetInstanceOfDerivedClass()
        {
            return (PersistentList<T>)Activator.CreateInstance(this.GetType());
        }
    }

使用法

Managers managers = (Managers)new Managers().GetInstanceOfDerivedClass();
于 2012-06-24T22:18:58.893 に答える