2014-02-22 30 views
0

是否有可能有一個PrintList()方法覆蓋Kid,StudentPerson類?任何類從一般基類派生的方法

我不希望實現PrintList()作爲一個類的方法到PersonKidStudentPerson

public class Person<T> 
{ 
    public T Id { get; set; } 
    public string Name { get; set; } 
} 

public class Kid : Person<byte> { } 
public class Student : Person<short> { } 
public class Adult : Person<int> { } 
/* ... more classes ... */ 


class Program 
{ 
    static void PrintList(List<T> list) where T : Person /* NOT POSSIBLE */ 
    { 
    foreach (var item in list) 
     Console.WriteLine("Id: {0}, Name: {1}", item.Id, item.Name); 
    } 

    static void Main(string[] args) 
    { 
    var students = new List<Student>(); 
    students.Add(new Student() { Id = 1, Name = "SA" }); 
    students.Add(new Student() { Id = 2, Name = "SB" }); 

    var adults = new List<Adult>(); 
    adults.Add(new Adult() { Id = 1, Name = "AA" }); 
    adults.Add(new Adult() { Id = 2, Name = "AB" }); 
    adults.Add(new Adult() { Id = 3, Name = "AC" }); 

    PrintList(students); 
    PrintList(adults); 

    Console.ReadLine(); 
    } 
} 

回答

3

嗯,首先你需要做的PrintList方法一般通過添加一種類型的參數:

static void PrintList<T>(List<T> list) where T : Person /* still doesn't work */ 

但是,這仍然無法正常工作,因爲Person不是一個類型;只有Person<T>適用於某些T。實際上,我們需要兩個類型參數:

static void PrintList<T, U>(List<T> list) where T : Person<U> 

這個工程的定義,但它意味着你有,當你調用該方法顯式提供類型:

PrintList<Student, short>(students); 
PrintList<Adult, int>(adults); 

這是可行的,但很醜。我們可以做得更好嗎?

原來我們可以。如果你讓你的簽名

static void PrintList<T>(IEnumerable<Person<T>> list) 

然後你可以回去不提供任何類型的參數。您在方法內部失去了處理list的能力,如List,但是您還沒有使用該方法。