在C#等语言中,有一个叫做方法隐藏的奇怪功能。它是通过将'new'修饰符应用于与基类中的函数或方法具有相同名称的函数和方法来实现的。它与重写的不同之处在于它不会取代实现,而是取代整个事物,签名等等。它本质上说'当使用这个子类时,我不在乎基类中是否存在方法'foo',我将'foo'定义为我想要的,就在这里。您可以更改参数,返回类型,甚至更改它以返回void。同样,它就像基类版本不存在一样。
这当然是可怕的,因为它彻底打破了多态性。但是,我发现了一个实际上可以带来好处的用途,同时也隐含地支持多态性。
请考虑以下事项。 (注意:我是用伪Java编写的,但是在C#中出现new
关键字。我也省略了所有不相关的样板文件等。)
class Employee{}
class Manager extends Employee{}
class JobPosition{
public JobPosition(Employee person){
_person = person;
}
private final Employee _person;
Employee getPerson(){ return _person; }
}
class ManagementPosition extends JobPosition{
public ManagementPosition(Manager person){
super(person);
}
}
在上文中,ManagementPosition只能使用Manager初始化。因为它是JobPosition的子类,所以它隐式包含来自基类的getPerson函数。
问题是即使你知道'人'是经理,返回类型仍然是Employee
,这意味着你必须在你需要的任何地方手动执行转换。虽然您可以公开getManager
方法,但这只是添加了一个冗余方法,其唯一目的就是强制转换。
现在考虑改为ManagementPosition,使用'new'修饰符隐藏getPerson的原始版本......
class ManagementPosition extends JobPosition{
public ManagementPosition(Manager person){
super(person);
}
new Manager getPerson(){
return (Manager)super.getPerson();
}
}
在这种情况下,现在getPerson返回一个实际的经理。而且因为签名完全相同,所以它也不会破坏多态性。您仍然可以在任何需要JobPosition的地方传递此信息,而getPerson仍然会返回一名员工。甚至带有Employee的函数也可以从getEmployee返回经理。但是当你需要经理特定的成员时,它已经为你铸造了。
所以我想知道的是,Java是否有与此功能相似的东西?