2013-03-19 96 views
1

我有一個類:如何擴展基類的功能

public class Person { 
    public string FirstName = ""; 
    public string LastName = ""; 
} 

和派生類:

public class HRPerson : Person { 
    public string GetSomething() { 
     //calculate something 
    } 
} 

Essentilly,我想擴展基類的功能。使用看起來像這樣,其中GetAllPerson返回List<Person>

class Program 
{ 
    static List<HRPerson> GetAllHRPerson() 
    { 
     List<HRPerson> HRPersonList = new List<HRPerson>(); 
     foreach (Person person in GetAllPerson) 
     { 
      HRPersonList.Add(person); 
     } 
     return HRPersonList; 
    } 
} 

它不會編譯,說是沒有超載的參數,當我嘗試投人HRPerson,我得到的運行時錯誤「無法施展Person類型的對象鍵入HRPerson」錯誤。

我該如何去添加這樣的附加功能?

+0

你能提供更多的信息,你正在努力實現什麼? – 2013-03-19 18:53:51

回答

6

這聽起來像你GetAllPerson正在恢復一些非HR人......

假設是這樣的話,你只是想篩選那些出來,這是最容易使用LINQ的OfType方法:

static List<HRPerson> GetAllHRPerson() 
{ 
    return GetAllPerson().OfType<HRPerson>().ToList(); 
} 

(附註:請避開公共領域尚且如此,比常數等領域應該是一個實現細節,而不是你的公共API的一部分。)

當然,如果沒有你的的實例實際上是HRPerson的實例,這不會幫助你。創建完成後,您無法更改實例的類型。目前尚不清楚你的情況 - 如果這個答案不能幫助你,請提供更多細節。

編輯:我還沒有真正確定你想要的擴展方法,但如果這樣做,這將是這樣的:

public static class PersonExtensions 
{ 
    public static string GetSomething(this Person person) 
    { 
     // Do something with the given Person 
    } 
} 

然後,您可以調用任何Person就好像它是實例方法:

Person person = ...; 
string something = person.GetSomething(); 

但這多態 - 這並不是說你改變對Person對象,你的描述仍然使得它聽起來像你真的想d什麼Ø...根據您的意見,以喬恩斯基特的回答

+0

GetAllPerson僅返回Person列表。 – Tremour101 2013-03-19 18:55:14

+0

@ Tremors101:那麼你是如何期待它的工作?如果沒有一個參考文獻實際上指的是「HRPerson」,那麼您是如何指望創建的? – 2013-03-19 18:57:34

+0

這是一個縮小的例子。這個想法是,不同的客戶端代碼可能會得到不同版本的Person類。例如HRPerson.GetFullName可能會返回'LName,FName',而CCPerson.GetFullName可能會返回'FName LName',並且我沒有對Person類的任何控制權,並且Person.GetFullName不存在 – Tremour101 2013-03-19 18:58:17

0

,這是你在找什麼:

創建人的一個子類,例如,NamedPerson。給NamedPerson一個方法GetFullName,它返回Person的全名。

然後從NamedPerson創建一個子類HRPerson,並覆蓋GetFullName以稍微不同的格式返回名稱。 CCPerson也將從NamedPerson繼承。

您無法控制Person,但您完全控制了NamedPerson。那麼你想要的是一個NamedPersons列表,而不是HRPersons列表。這個列表可能包含裸的NamedPersons,或者HRPersons或者CCPersons,但是列表中的所有對象都是NamedPersons或者它的子類,所以它們都會有GetFullName。

+0

因此,當我從我的數據提供者處獲得人員列表時,如何將他們轉換爲NamedPerson?通過子類,你的意思是:Class NamedPerson:Person {} – Tremour101 2013-03-19 20:56:08

+0

如果你從某個地方獲得Person並且無法控制它,並且希望使用基類方法添加子類,那麼你可以做的一件事就是創建NamedPerson,它具有一個人作爲成員。它不是一個子類 - 它是一個新的基類,裏面有一個Person。然後公開NamedPerson.GetFullName,並從NamedPerson中創建所有的子類。 – 2013-03-20 18:09:33