使用“方法隐藏”有什么意义?

时间:2013-01-22 15:10:20

标签: c# methods method-hiding

  

可能重复:
  method hiding in c# with a valid example .why is it implemented in the framework.? what is the Real world advantage.?

我想知道方法隐藏在c#中有用吗?如果你深入研究这个概念,你会发现隐藏的方法是令人困惑,并驱使我们采用意大利面条代码风格。有一些原因:

1-如果在Derived类中需要一个新方法,则可以在派生类中使用新名称定义新方法。

2 - 在使用upcasting时以多态方式使用,预期的行为将无法实现,这可能会令人困惑。

(特别是如果Base类和Derived Class位于不同的库中并且您希望在代码中的某个位置使用它们,这种奇怪的行为可能会非常明显和明显)

class Base
{  
    public void Method() { Console.WriteLine("I am Base Class"); }
}
class Derived: Base
{
    public new void Method() { Console.WriteLine("I am Derived Class");}
}
class Program
{
    static void Main(string[] args)
    {
        Base C = new Derived();
        C.Method(); //output:"I am Base Class"
    }
}

这种行为可能令人困惑,但如果我们在“基础”和“覆盖”中使用“虚拟” > Derived “(我的意思是多态用法)输出是:”我是派生类“。 这个输出是我认为我们大多数人所期望的。

换句话说,我相信在层次结构中,大多数开发人员都希望在派生类中使用重写方法而不是新方法,而是希望隐藏基类实现。

我无法理解为什么在c#语言中没有优势的坏事?至少我想知道隐藏在c#中的方法的最佳用法是什么?

谢谢你的帮助

1 个答案:

答案 0 :(得分:6)

  

如果您需要在Derived类中使用新方法,则可以在派生类中使用新名称定义新方法

并非总是如此。考虑这样一种情况,即您派生出一个在其他库中公开的类,一个您无法控制的类。你可以为你的班级添加一些方法。

稍后,您依赖的库的开发人员会添加一些增强功能,并使用与您添加到派生类的方法相同的名称。隐藏在这种情况下仅仅是保留现有功能。如果更改方法名称,则必须更新整个代码库,并且与使用库的任何人断开兼容性。相反,您可以隐藏现有方法并保持与您的家属以及您同时依赖的库的兼容性。

就个人而言,我使用隐藏最多方法的情况是在多个类上实现克隆操作时;没有此功能,我无法更改返回类型以匹配类的类型:

class A
{
    public A Clone()
    {
        return CloneImpl();
    }

    protected virtual A CloneImpl()
    {
        return MemberwiseClone();
    }
}

class B : A
{
    new public B Clone()
    {
        return (B)CloneImpl();
    }
}

受保护的虚拟方法意味着无论您调用哪个Clone(),您仍然可以获得正确类型的对象。但是,您获得的引用类型取决于您用于调用Clone()的引用类型。这允许:

B b = new B();
B b2 = b.Clone(); // Did not have to cast, thanks to the hiding method.

A a = b;
A a2 = a.Clone(); // Still returns a B, only typed as an A.