2013-03-19 94 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