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

 例如:定义一个基类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());

 

 

相关文章:

  • 2021-11-24
  • 2022-12-23
  • 2022-01-23
  • 2021-11-07
  • 2021-10-23
  • 2021-06-21
  • 2021-12-01
猜你喜欢
  • 2021-09-06
  • 2021-07-07
  • 2022-12-23
  • 2021-06-11
  • 2021-08-04
  • 2022-12-23
相关资源
相似解决方案