C#继承与多态之成员投影

 先来了解下什么是成员投影。如果在派生类中定义了与父类中同样名称的成员(属性,方法,字段..),那么派生类就投影了父类的一个副本。

 例如:定义一个基类BaseEntityInfo,一个派生类:EmployeeInfo, 在派生类中定义了与基类重名的属性Name,以及GetInfo方法

class BaseEntityInfo
{
publicstring Name { get; set; }
publicint ID{get;set;}

publicstring GetInfo()
{
return ID.ToString() +"-"+ Name;
}
}
class EmployeeInfo:BaseEntityInfo
{
publicstring Name { get; set; }
publicint Age { get; set; }

publicstring GetInfo()
{
return ID.ToString() +"-"+ Name +"-"+ Age.ToString();
}
}

 

当编译之后会收到一个警告信息,大意为--在基类中已经定义了该属性或方法,如若继续使用,请添加new关键字

那么,如果要解决此问题,有两个解决方案:

其一,在基类中给Name属性,GetInfo()方法添加virtual关键字,然后在派生类中用override关键字进行属性/方法的重载。

其二,可以为派生类(EmployeeInfo)的成员(Name,GetInfo())添加new 关键字来达到覆盖,隐藏父类成员的目的。

这里我采用的是第二种方案:

class BaseEntityInfo
{
publicstring Name { get; set; }
publicint ID{get;set;}

publicstring GetInfo()
{
return ID.ToString() +"-"+ Name;
}
}
class EmployeeInfo:BaseEntityInfo
{
//隐藏基类中的Name属性
publicnewstring Name { get; set; }

publicint Age { get; set; }

//隐藏基类中的GetInfo方法
publicnewstring GetInfo()
{
return ID.ToString() +"-"+ Name +"-"+ Age.ToString();
}
}

 

 

再次编译,成功通过.

另外值得注意的是,

1. 可以把new关键字任何从基类中继承的成员类型中

2. 仍然可以采用显示转换的方式来调用基类中的成员实现方式.aa

EmployeeInfo emp =new EmployeeInfo {
ID
=10001,
Age
=27,
Name
="Ekin"
};
Console.WriteLine(emp.GetInfo());
Console.WriteLine(((BaseEntityInfo)emp).GetInfo());

 

 

posted @ 2010-12-16 13:09  断肠人在天涯  阅读(971)  评论(0编辑  收藏  举报