c# - 什么情况下使用 "method hiding"有意义?

标签 c# methods method-hiding

<分区>

Possible Duplicate:
method hiding in c# with a valid example .why is it implemented in the framework.? what is the Real world advantage.?

我想知道方法隐藏在 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"
    }
}

这样的行为可能会造成混淆,但如果我们在“Base”中使用“virtual”,在“”中使用“override” >Derived”(我的意思是多态用法)输出是:“我是派生类”。 这个输出是我认为我们大多数人所期望的。

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

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

谢谢你的帮助

最佳答案

If you need a fresh method in your Derived class you can define a new method with a new name in your derived class

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

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

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

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

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

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

protected 虚方法意味着无论您调用哪个 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.

关于c# - 什么情况下使用 "method hiding"有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14461725/

相关文章:

C++命名空间名称隐藏

c# - 对象的组成与函数: Should I use one method interfaces or delegates?

c# - 找不到类型或命名空间名称 'Uri' : (System. 包含 Uri 命名空间)

C# 数据表 LINQ 和 GROUP BY

java - 如何使用从 Java 中的方法返回的数组

如果输入char,C++调用不同的方法

c# - 继承方法无法访问派生类中的新实现

c# - Entity Framework 异常: Schema specified is not valid.

java - 是否有一种经过批准的方法来根据 Java 类的功能对其进行分类?

java - Java中隐藏的方法是什么?甚至 JavaDoc 的解释也令人困惑