姓名隐藏vs OVERRIDE

时间:2013-10-07 19:59:16

标签: c# .net oop

您何时会在覆盖关键字上实现名称隐藏? 由于使用名称隐藏提供的功能可以使用override关键字?

来实现

3 个答案:

答案 0 :(得分:2)

好吧,如果你需要覆盖一个不是virtual的成员。 override关键字适用于virtualabstract成员。

如果是virtual成员,则选择override代替隐藏,因为当您override时,您仍然可以执行base

答案 1 :(得分:2)

overridenew 等效,并且不提供相同的功能。

以这些类为例。

public class Herple
{
    public virtual void DoTheVirtualHerple()
    {
        Console.WriteLine("Virtual Herple!");
    }

    public void DoTheHerple()
    {
        Console.WriteLine("Herple!");
    }
}

public class Derple : Herple
{
    public override void DoTheVirtualHerple()
    {
        Console.WriteLine("Actually I'd prefer to Derple!");
    }

    public new void DoTheHerple()
    {
        Console.WriteLine("Let's Derple instead!");
    }
}

Derple实例分配给类型为Herple的变量时,调用哪个具体方法的行为会根据方法是否被覆盖或隐藏而更改。 e.g:

var herpleList = new List<Herple> {new Herple(), new Derple()};

foreach (var curple in herpleList)
{
    curple.DoTheVirtualHerple();
    curple.DoTheHerple();
}

打印:

Virtual Herple!
Herple!
其实我更喜欢Derple!
Herple!

对于你原来的问题,至于你何时更喜欢名字隐藏到覆盖,一般来说你不会更喜欢它,但是如果你是从API扩展类,那么你不是负责,这可能是你唯一的选择。但是,您应该知道在任何使用基类的情况下都不会调用您的逻辑,并相应地进行规划,并验证您的设计是否真正正确。

答案 2 :(得分:1)

如果基类中的方法不是virtualabstract,那么除了隐藏它之外别无选择。另请记住,如果您不使用隐藏方法的关键字new,您将收到警告。

new Modifier (C# Reference

  

您可以在不使用new修饰符的情况下隐藏成员,但结果是   一个警告。如果使用new来显式隐藏成员,则使用修饰符   抑制此警告并记录派生的事实   版本旨在替代。

您可能还会看到:What's the difference between override and new? - Jon Skeet