C#中隐藏方法或属性的优点和缺点是什么?
答案 0 :(得分:3)
使用new
关键字隐藏的方法具有破坏多态性的效果。如果您正在使用方法隐藏,则在通过其基本类型或接口访问方法时无法调用隐藏行为。
void Main()
{
var nohiding = new NoHiding();
var hiding = new Hiding();
nohiding.DoSomething(); // "Overridden Method"
hiding.DoSomething(); // "Hidden Method"
var nohidingAsBase = (Base) nohiding;
var hidingAsBase = (Base) hiding;
nohidingAsBase.DoSomething(); // "Overridden Method"
hidingAsBase.DoSomething(); // "Base Method"
}
public class Base
{
public virtual void DoSomething()
{
Console.WriteLine("Base Method");
}
}
public class NoHiding : Base
{
public override void DoSomething()
{
Console.WriteLine("Overriden Method");
}
}
public class Hiding : Base
{
new public void DoSomething()
{
Console.WriteLine("Hidden Method");
}
}
至于你的优缺点问题,没有明确的清单。方法隐藏很少使用,我会说它有点像goto
关键字。一般来说,这不是你应该使用的东西,但在特定情况下它可能非常有用。
答案 1 :(得分:2)
我认为财产隐藏没有任何优势。当基类中的属性或方法未定义为虚拟或抽象,或者您的方法与返回类型的基类方法不同时,您必须这样做。缺点很明显。基类方法仍然存在,并且您无法强制类用户使用您的方法:
Derived d = new Derived();
((Base)d).DoSomething() // this will call the base method