0

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

4

3 回答 3

2

好吧,如果您需要覆盖不是virtual. override关键字是for virtualor abstractmembers 。

如果它是virtual成员,那么宁愿override而不是隐藏,因为当您override仍然可以执行base.

于 2013-10-07T19:59:51.157 回答
2

override并且new不等效,并且不提供相同的功能

以这些类为例。

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调用哪个具体方法的行为会根据该方法是否被覆盖或隐藏而改变。例如:

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

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

印刷:

虚拟赫普勒!
赫普尔!
其实我更喜欢Derple!
赫普尔!

对于您最初的问题,关于何时您更喜欢名称隐藏而不是覆盖,通常您不会喜欢它,但如果您从您不负责的 API 扩展类,它可能是您唯一的选择。但是,您应该注意,在使用基类的任何情况下都不会调用您的逻辑,并相应地进行计划,并验证您的设计是否确实正确。

于 2013-10-07T20:16:01.683 回答
1

如果您在基类中的方法不是virtual,或者abstract您别无选择,只能隐藏它。还请记住,如果您不使用new方法隐藏关键字,您将收到警告。

新修饰符(C# 参考

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

您可能还会看到:override 和 new 有什么区别?- 乔恩斯基特

于 2013-10-07T20:01:22.227 回答