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();
}
}
{
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();
}
}
{
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());
ID =10001,
Age=27,
Name ="Ekin"
};
Console.WriteLine(emp.GetInfo());
Console.WriteLine(((BaseEntityInfo)emp).GetInfo());