2017-08-24 161 views
2

我知道類似的問題在這裏經常被問到,但我一直在尋找一些處理我遇到的問題的東西。抽象類的靜態方法

我正在構建一個應用程序,併爲'Team','Manager'和'Employee'分別設置了三個類。我意識到我爲所有三個代碼重複了很多代碼,所以我定義了一個名爲'Worker'的抽象類。

在每個班的我已經定義了一個GetAllX方法,返回和IEnumerable<X>,例如:

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

我要的是能夠在我的抽象類定義一個方法叫做GetAll這將返回T類型的IEnumerable,其中T是從我的抽象類繼承的類。有沒有辦法實現這樣的事情?

+6

有時我很遺憾堆棧溢出不會接受「否」作爲完整的評論。 –

+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 
{ 
} 

而且這種方法使用不同的靜態變量調用var managers = Worker.GetAll<Manager>();


另一種方法,在註釋中所描述想要什麼OP。

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

這是超級接近!我希望能夠在每個Class中定義一個靜態變量,我需要調用'GetAll',並且能夠在查詢中使用該靜態變量,我將實際運行它們的'GetAll'。使用這種方法,我可以打開'typeof(T)',它包含在我喜歡的worker類中,我最終只用三個單獨命名的方法編寫了一個單獨的靜態類,因爲它不是那麼多的代碼複製。雖然謝謝! –

+0

「我可以打開'typeof(T)'」 - _請不要那麼做,那就像你沒有按照他們應該使用的方式使用類一樣! – CompuChip