在基本类型“virtual”中声明一个方法,然后在子类型中使用“override”关键字重写它,与在子类型中声明匹配的方法时简单地使用“new”关键字相比,两者之间有什么区别?


当前回答

new关键字用于隐藏。-意味着你在运行时隐藏你的方法。输出将基于基类方法。 Override用于重写。-表示您正在调用派生类方法引用基类。输出将基于派生类方法。

其他回答

我总是觉得这样的事情用图片更容易理解:

再一次,用joseph daigle的密码,

public class Foo
{
     public /*virtual*/ bool DoSomething() { return false; }
}

public class Bar : Foo
{
     public /*override or new*/ bool DoSomething() { return true; }
}

如果你像这样调用代码:

Foo a = new Bar();
a.DoSomething();

注意:重要的是,我们的对象实际上是一个Bar,但我们将它存储在类型为Foo的变量中(这类似于强制转换它)。

那么结果将如下所示,这取决于您在声明类时使用的是virtual/override还是new。

不标记方法意味着:使用对象的编译类型绑定该方法,而不是运行时类型(静态绑定)。

用虚方法标记方法:使用对象的运行时类型绑定该方法,而不是编译时类型(动态绑定)。

在派生类中使用override标记基类虚方法意味着:这是使用对象的运行时类型绑定的方法(动态绑定)。

在派生类中用new标记基类虚方法意味着:这是一个新方法,它与基类中同名的方法没有关系,它应该使用对象的编译时类型进行绑定(静态绑定)。

在派生类中不标记基类虚方法意味着:该方法被标记为new(静态绑定)。

将一个方法标记为抽象意味着:这个方法是虚的,但是我不会为它声明一个主体,而且它的类也是抽象的(动态绑定)。

“new”关键字不会重写,它表示一个与基类方法无关的新方法。

public class Foo
{
     public bool DoSomething() { return false; }
}

public class Bar : Foo
{
     public new bool DoSomething() { return true; }
}

public class Test
{
    public static void Main ()
    {
        Foo test = new Bar ();
        Console.WriteLine (test.DoSomething ());
    }
}

它输出false,如果你使用override,它会输出true。

(基本代码取自Joseph Daigle)

所以,如果你在做真正的多态性,你应该总是OVERRIDE。唯一需要使用“new”的地方是当方法与基类版本没有任何关联时。

new关键字实际上创建了一个全新的成员,该成员只存在于该特定类型上。

例如

public class Foo
{
     public bool DoSomething() { return false; }
}

public class Bar : Foo
{
     public new bool DoSomething() { return true; }
}

该方法存在于这两种类型上。当您使用反射并获取Bar类型的成员时,您实际上会发现两个称为DoSomething()的方法看起来完全相同。通过使用new,你可以有效地将实现隐藏在基类中,这样当类从Bar派生出来时(在我的例子中),对base. dosomething()的方法调用就会到Bar而不是Foo。

override关键字和new关键字之间的区别在于前者执行方法覆盖,后者执行方法隐藏。

查看以下链接获取更多信息…

MSDN及其他