1

C# 中方法或属性隐藏的优点和缺点是什么。

4

2 回答 2

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关键字。一般来说,这不是你应该使用的东西,但在特定情况下它会很有帮助。

于 2012-07-22T14:35:36.287 回答
2

我认为隐藏财产没有任何优势。当基类中的属性或方法未定义为虚拟或抽象时,或者当您的方法与基类方法的返回类型不同时,您必须这样做。缺点很明显。基类方法仍然存在,您无法强制类用户使用您的方法:

Derived d = new Derived();
((Base)d).DoSomething() // this will call the base method
于 2012-07-22T14:38:15.367 回答