2017-08-24 17 views
2

私はよく似たような質問がここで十分に尋ねられていることを知っていますが、私が持っている問題を扱うものについてはしばらく探しています。抽象クラスからの静的メソッド

私はアプリケーションを構築しており、 'チーム'、 'マネージャ'、 '従業員'の3つのクラスに分かれています。私は3つすべてのコードを繰り返していることに気付き、抽象クラス 'Worker'を定義しました。私は、例えば、返し、IEnumerable<X>GetAllX方法定義したクラスのそれぞれに

:私が欲しいもの

public static IEnumerable<Manager> GetAllManagers() 
{ 
    //Code to get all managers 
    yield return m 
    //find next manager and loop 
} 

は意志GetAllと呼ばれる私の抽象クラスでメソッドを定義することができることですT型のIEnumerableを返します。ここで、Tは自分の抽象クラスを継承するクラスです。このようなことを達成する方法はありますか?

+6

時には、Stack Overflowが完全なコメントとして「いいえ」を受け入れないことは残念です。 –

+2

静的ナンセンスについては忘れて、抽象的な 'GetAll'を作成して実装してください。 – FCin

+3

Managerという名前のクラスにGetAllMangersというメソッドがあるのはなぜですか?あなたはあまりにも多くのものを混合しています – sam

答えて

0

技術的に、あなたは

abstract class Worker 
{ 
    public static IEnumerable<T> GetAll<T>() where T : Worker 
    { 
     //your code 
    } 
} 

class Manager : Worker 
{ 
} 

class Employee : Worker 
{ 
} 

、コメントで説明したようにOPが何を望んで異なる静的変数を使用して、別のアプローチvar managers = Worker.GetAll<Manager>();


を呼び出し、この方法を行うことができます。

abstract class Worker<T> where T : Worker<T> 
{ 
    protected static string name; 

    public static IEnumerable<T> GetAll() 
    { 
     Console.WriteLine(name); 
     return Enumerable.Empty<T>(); 
    } 
} 

class Manager : Worker<Manager> 
{ 
    static Manager() 
    { 
     name = "Manager"; 
    } 
} 

class Employee : Worker<Employee> 
{ 
    static Employee() 
    { 
     name = "Employee"; 
    } 
} 

、技術的

//create object to call static constructors 
//this need only once for every concrete class 
var test = new Manager(); 
var test1 = new Employee(); 

var managers = Worker<Manager>.GetAll(); 
var employees = Worker<Employee>.GetAll(); 

を使用して、あなたはそれを行うことができますが、私の意見では、古典リポジトリは、より適しているアプローチです。

+0

これはとても近いです!私は 'GetAll'を呼び出す必要がある静的変数を定義することができ、実際に' GetAll'を実行するクエリでその静的変数を使用できるようにする必要がありました。このアプローチを使用すると、 'typeof(T)'を有効にすることができ、それは私が好きなワーカークラスに含まれています。別の静的クラスを3つの別個のメソッドで記述するだけです。複製する。しかし、ありがとう! –

+0

"私は' typeof(T) 'をオンにすることができます" - _Please_そうしないでください。 – CompuChip

関連する問題