什么场景下才需要使用“方法隐藏”? [复制]

2024-04-23

可能的重复:
隐藏在 C# 中的方法并带有有效示例。为什么它在框架中实现?现实世界的优势是什么? https://stackoverflow.com/questions/1193848/method-hiding-in-c-sharp-with-a-valid-example-why-is-it-implemented-in-the-fram

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

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

2-当您使用向上转换时,以多态方式使用,将无法实现预期的行为,这可能会令人困惑。

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

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"
    }
}

这种行为可能会令人困惑,但如果我们使用“virtual" in "Base" and "override" in "Derived“(我的意思是多态用法)输出是:“我是派生类”。 我认为这个输出是我们大多数人所期望的。

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

我不明白为什么c#语言中有这样一个没有优点的坏东西?至少我想知道 C# 中隐藏方法的最佳用法是什么?

感谢您的帮助


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

不总是。考虑这样一种情况,您派生了一个在其他库中公开的类,而您无法控制该库。您向类中添加一些方法。

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

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

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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么场景下才需要使用“方法隐藏”? [复制] 的相关文章

随机推荐